/*
 Highcharts JS v2.1.9 (2011-11-11)

 (c) 2009-2011 Torstein H?nsi

 License: www.highcharts.com/license
*/
(function() {

    function sa(a, b) {
        var c;
        a || (a = { });
        for (c in b) a[c] = b[c];
        return a;
    }

    function ja(a, b) {
        return parseInt(a, b || 10);
    }

    function Sb(a) {
        return typeof a === "string";
    }

    function Nb(a) {
        return typeof a === "object";
    }

    function lc(a) {
        return typeof a === "number";
    }

    function mc(a) {
        return Fa.log(a) / Fa.LN10;
    }

    function nc(a, b) {
        for (var c = a.length; c--;)
            if (a[c] === b) {
                a.splice(c, 1);
                break;
            }
    }

    function K(a) {
        return a !== Wa && a !== null;
    }

    function Ga(a, b, c) {
        var d, e;
        if (Sb(b))
            if (K(c)) a.setAttribute(b, c);
            else {
                if (a && a.getAttribute) e = a.getAttribute(b);
            }
        else if (K(b) &&
            Nb(b)) for (d in b) a.setAttribute(d, b[d]);
        return e;
    }

    function zc(a) {
        return Object.prototype.toString.call(a) === "[object Array]" ? a : [a];
    }

    function A() {
        var a = arguments, b, c, d = a.length;
        for (b = 0; b < d; b++) {
            c = a[b];
            if (typeof c !== "undefined" && c !== null) return c;
        }
    }

    function Ja(a, b) {
        if (Pc) if (b && b.opacity !== Wa) b.filter = "alpha(opacity=" + b.opacity * 100 + ")";
        sa(a.style, b);
    }

    function hb(a, b, c, d, e) {
        a = ua.createElement(a);
        b && sa(a, b);
        e && Ja(a, { padding: 0, border: jb, margin: 0 });
        c && Ja(a, c);
        d && d.appendChild(a);
        return a;
    }

    function yb(a, b) {
        var c =
            function() {
            };
        c.prototype = new a;
        sa(c.prototype, b);
        return c;
    }

    function Ed(a, b, c, d) {
        var e = Xa.lang;
        a = a;
        var f = isNaN(b = bb(b)) ? 2 : b;
        b = c === undefined ? e.decimalPoint : c;
        d = d === undefined ? e.thousandsSep : d;
        e = a < 0 ? "-" : "";
        c = String(ja(a = bb(+a || 0).toFixed(f)));
        var g = c.length > 3 ? c.length % 3 : 0;
        return e + (g ? c.substr(0, g) + d : "") + c.substr(g).replace( /(\d{3})(?=\d)/g , "$1" + d) + (f ? b + bb(a - c).toFixed(f).slice(2) : "");
    }

    function Fd(a) {
        var b = { left: a.offsetLeft, top: a.offsetTop };
        for (a = a.offsetParent; a;) {
            b.left += a.offsetLeft;
            b.top += a.offsetTop;
            if (a !== ua.body && a !== ua.documentElement) {
                b.left -= a.scrollLeft;
                b.top -= a.scrollTop;
            }
            a = a.offsetParent;
        }
        return b;
    }

    function Gd() {
        this.symbol = this.color = 0;
    }

    function fe(a, b, c, d, e, f, g) {
        var h = g.x;
        g = g.y;
        var i = h - a + c - 25, j = g - b + d + 10, m;
        if (i < 7) i = c + h + 15;
        if (i + a > c + e) {
            i -= i + a - (c + e);
            j -= b;
            m = true;
        }
        if (j < 5) {
            j = 5;
            if (m && g >= j && g <= j + b) j = g + b - 5;
        } else if (j + b > d + f) j = d + f - b - 5;
        return { x: i, y: j };
    }

    function Hd(a, b) {
        var c = a.length, d;
        for (d = 0; d < c; d++) a[d].ss_i = d;
        a.sort(function(e, f) {
            var g = b(e, f);
            return g === 0 ? e.ss_i - f.ss_i : g;
        });
        for (d = 0; d < c; d++) delete a[d].ss_i;
    }

    function Ac(a) {
        for (var b in a) {
            a[b] && a[b].destroy && a[b].destroy();
            delete a[b];
        }
    }

    function oc(a, b) {
        Bc = A(a, b.animation);
    }

    function Id() {
        var a = Xa.global.useUTC;
        Qc = a ? Date.UTC : function(b, c, d, e, f, g) { return (new Date(b, c, A(d, 1), A(e, 0), A(f, 0), A(g, 0))).getTime(); };
        id = a ? "getUTCMinutes" : "getMinutes";
        jd = a ? "getUTCHours" : "getHours";
        kd = a ? "getUTCDay" : "getDay";
        Cc = a ? "getUTCDate" : "getDate";
        Rc = a ? "getUTCMonth" : "getMonth";
        Sc = a ? "getUTCFullYear" : "getFullYear";
        Jd = a ? "setUTCMinutes" : "setMinutes";
        Kd = a ? "setUTCHours" : "setHours";
        ld =
            a ? "setUTCDate" : "setDate";
        Ld = a ? "setUTCMonth" : "setMonth";
        Md = a ? "setUTCFullYear" : "setFullYear";
    }

    function pc(a) {
        Tc || (Tc = hb(Tb));
        a && Tc.appendChild(a);
        Tc.innerHTML = "";
    }

    function Uc() {
    }

    function Nd(a, b) {

        function c(p) {

            function q(k, n) {
                this.pos = k;
                this.minor = n;
                this.isNew = true;
                n || this.addLabel();
            }

            function w(k) {
                if (k) {
                    this.options = k;
                    this.id = k.id;
                }
                return this;
            }

            function x(k, n, t, r) {
                this.isNegative = n;
                this.options = k;
                this.x = t;
                this.stack = r;
                this.alignOptions = {
                    align: k.align || (va ? n ? "left" : "right" : "center"),
                    verticalAlign: k.verticalAlign ||
                    (va ? "middle" : n ? "bottom" : "top"),
                    y: A(k.y, va ? 4 : n ? 14 : -6),
                    x: A(k.x, va ? n ? -6 : 6 : 0)
                };
                this.textAlign = k.textAlign || (va ? n ? "right" : "left" : "center");
            }

            function V() {
                var k = [], n = [], t;
                pa = wa = null;
                zb = [];
                u(Ha, function(r) {
                    t = false;
                    u(["xAxis", "yAxis"], function(F) {
                        if (r.isCartesian && (F === "xAxis" && xa || F === "yAxis" && !xa) && (r.options[F] === o.index || r.options[F] === Wa && o.index === 0)) {
                            r[F] = I;
                            zb.push(r);
                            t = true;
                        }
                    });
                    if (!r.visible && z.ignoreHiddenSeries) t = false;
                    if (t) {
                        var J, E, Q, fa, ka, $;
                        if (!xa) {
                            J = r.options.stacking;
                            Vc = J === "percent";
                            if (J) {
                                ka =
                                    r.options.stack;
                                fa = r.type + A(ka, "");
                                $ = "-" + fa;
                                r.stackKey = fa;
                                E = k[fa] || [];
                                k[fa] = E;
                                Q = n[$] || [];
                                n[$] = Q;
                            }
                            if (Vc) {
                                pa = 0;
                                wa = 99;
                            }
                        }
                        if (r.isCartesian) {
                            u(r.data, function(F) {
                                var O = F.x, S = F.y, aa = S < 0, Eb = aa ? Q : E, kb = aa ? $ : fa;
                                if (pa === null) pa = wa = F[qa];
                                if (xa)
                                    if (O > wa) wa = O;
                                    else {
                                        if (O < pa) pa = O;
                                    }
                                else if (K(S)) {
                                    if (J) Eb[O] = K(Eb[O]) ? Eb[O] + S : S;
                                    S = Eb ? Eb[O] : S;
                                    F = A(F.low, S);
                                    if (!Vc)
                                        if (S > wa) wa = S;
                                        else if (F < pa) pa = F;
                                    if (J) {
                                        s[kb] || (s[kb] = { });
                                        s[kb][O] || (s[kb][O] = new x(o.stackLabels, aa, O, ka));
                                        s[kb][O].setTotal(S);
                                    }
                                }
                            });
                            if ( /(area|column|bar)/ .test(r.type) &&
                                !xa)
                                if (pa >= 0) {
                                    pa = 0;
                                    Od = true;
                                } else if (wa < 0) {
                                    wa = 0;
                                    Pd = true;
                                }
                        }
                    }
                });
            }

            function N(k, n) {
                var t, r;
                Fb = n ? 1 : Fa.pow(10, lb(Fa.log(k) / Fa.LN10));
                t = k / Fb;
                if (!n) {
                    n = [1, 2, 2.5, 5, 10];
                    if (o.allowDecimals === false || ca)
                        if (Fb === 1) n = [1, 2, 5, 10];
                        else if (Fb <= 0.1) n = [1 / Fb];
                }
                for (r = 0; r < n.length; r++) {
                    k = n[r];
                    if (t <= (n[r] + (n[r + 1] || n[r])) / 2) break;
                }
                k *= Fb;
                return k;
            }

            function ta(k) {
                var n;
                n = k;
                Fb = A(Fb, Fa.pow(10, lb(Fa.log(Ta) / Fa.LN10)));
                if (Fb < 1) {
                    n = W(1 / Fb) * 10;
                    n = W(k * n) / n;
                }
                return n;
            }

            function da() {
                var k, n, t, r, J = o.tickInterval, E = o.tickPixelInterval;
                k = o.maxZoom ||
                    (xa && !K(o.min) && !K(o.max) ? tb(l.smallestInterval * 5, wa - pa) : null);
                ya = R ? Da : Aa;
                if (Ub) {
                    t = l[xa ? "xAxis" : "yAxis"][o.linkedTo];
                    r = t.getExtremes();
                    ia = A(r.min, r.dataMin);
                    ra = A(r.max, r.dataMax);
                } else {
                    ia = A(Vb, o.min, pa);
                    ra = A(Gb, o.max, wa);
                }
                if (ca) {
                    ia = mc(ia);
                    ra = mc(ra);
                }
                if (ra - ia < k) {
                    r = (k - ra + ia) / 2;
                    ia = Ia(ia - r, A(o.min, ia - r), pa);
                    ra = tb(ia + k, A(o.max, ia + k), wa);
                }
                if (!Ya && !Vc && !Ub && K(ia) && K(ra)) {
                    k = ra - ia || 1;
                    if (!K(o.min) && !K(Vb) && Qd && (pa < 0 || !Od)) ia -= k * Qd;
                    if (!K(o.max) && !K(Gb) && Rd && (wa > 0 || !Pd)) ra += k * Rd;
                }
                Ta = ia === ra ? 1 : Ub && !J && E === t.options.tickPixelInterval ?
                    t.tickInterval : A(J, Ya ? 1 : (ra - ia) * E / ya);
                if (!D && !K(o.tickInterval)) Ta = N(Ta);
                I.tickInterval = Ta;
                Wc = o.minorTickInterval === "auto" && Ta ? Ta / 5 : o.minorTickInterval;
                if (D) {
                    Ba = [];
                    J = Xa.global.useUTC;
                    var Q = 1E3 / ub, fa = 6E4 / ub, ka = 36E5 / ub;
                    E = 864E5 / ub;
                    k = 6048E5 / ub;
                    r = 2592E6 / ub;
                    var $ = 31556952E3 / ub, F = [["second", Q, [1, 2, 5, 10, 15, 30]], ["minute", fa, [1, 2, 5, 10, 15, 30]], ["hour", ka, [1, 2, 3, 4, 6, 8, 12]], ["day", E, [1, 2]], ["week", k, [1, 2]], ["month", r, [1, 2, 3, 4, 6]], ["year", $, null]], O = F[6], S = O[1], aa = O[2];
                    for (t = 0; t < F.length; t++) {
                        O = F[t];
                        S = O[1];
                        aa =
                            O[2];
                        if (F[t + 1]) if (Ta <= (S * aa[aa.length - 1] + F[t + 1][1]) / 2) break;
                    }
                    if (S === $ && Ta < 5 * S) aa = [1, 2, 5];
                    F = N(Ta / S, aa);
                    aa = new Date(ia * ub);
                    aa.setMilliseconds(0);
                    if (S >= Q) aa.setSeconds(S >= fa ? 0 : F * lb(aa.getSeconds() / F));
                    if (S >= fa) aa[Jd](S >= ka ? 0 : F * lb(aa[id]() / F));
                    if (S >= ka) aa[Kd](S >= E ? 0 : F * lb(aa[jd]() / F));
                    if (S >= E) aa[ld](S >= r ? 1 : F * lb(aa[Cc]() / F));
                    if (S >= r) {
                        aa[Ld](S >= $ ? 0 : F * lb(aa[Rc]() / F));
                        n = aa[Sc]();
                    }
                    if (S >= $) {
                        n -= n % F;
                        aa[Md](n);
                    }
                    S === k && aa[ld](aa[Cc]() - aa[kd]() + o.startOfWeek);
                    t = 1;
                    n = aa[Sc]();
                    Q = aa.getTime() / ub;
                    fa = aa[Rc]();
                    for (ka = aa[Cc](); Q <
                        ra && t < Da;) {
                        Ba.push(Q);
                        if (S === $) Q = Qc(n + t * F, 0) / ub;
                        else if (S === r) Q = Qc(n, fa + t * F) / ub;
                        else if (!J && (S === E || S === k)) Q = Qc(n, fa, ka + t * F * (S === E ? 1 : 7));
                        else Q += S * F;
                        t++;
                    }
                    Ba.push(Q);
                    Xc = o.dateTimeLabelFormats[O[0]];
                } else {
                    t = ta(lb(ia / Ta) * Ta);
                    n = ta(md(ra / Ta) * Ta);
                    Ba = [];
                    for (t = ta(t); t <= n;) {
                        Ba.push(t);
                        t = ta(t + Ta);
                    }
                }
                if (!Ub) {
                    if (Ya || xa && l.hasColumn) {
                        n = (Ya ? 1 : Ta) * 0.5;
                        if (Ya || !K(A(o.min, Vb))) ia -= n;
                        if (Ya || !K(A(o.max, Gb))) ra += n;
                    }
                    n = Ba[0];
                    t = Ba[Ba.length - 1];
                    if (o.startOnTick) ia = n;
                    else ia > n && Ba.shift();
                    if (o.endOnTick) ra = t;
                    else ra < t && Ba.pop();
                    Ob || (Ob = { x: 0, y: 0 });
                    if (!D && Ba.length > Ob[qa]) Ob[qa] = Ba.length;
                }
            }

            function Ma() {
                var k, n;
                Dc = ia;
                Sd = ra;
                V();
                da();
                Hb = fb;
                fb = ya / (ra - ia || 1);
                if (!xa) for (k in s) for (n in s[k]) s[k][n].cum = s[k][n].total;
                if (!I.isDirty) I.isDirty = ia !== Dc || ra !== Sd;
            }

            function za(k) {
                k = (new w(k)).render();
                Pb.push(k);
                return k;
            }

            function eb() {
                var k = o.title, n = o.stackLabels, t = o.alternateGridColor, r = o.lineWidth, J, E, Q = (J = l.hasRendered) && K(Dc) && !isNaN(Dc);
                E = zb.length && K(ia) && K(ra);
                ya = R ? Da : Aa;
                fb = ya / (ra - ia || 1);
                cc = R ? X : vb;
                if (E || Ub) {
                    if (Wc && !Ya)
                        for (E = ia +
                            (Ba[0] - ia) % Wc; E <= ra; E += Wc) {
                            Wb[E] || (Wb[E] = new q(E, true));
                            Q && Wb[E].isNew && Wb[E].render(null, true);
                            Wb[E].isActive = true;
                            Wb[E].render();
                        }
                    u(Ba, function($, F) {
                        if (!Ub || $ >= ia && $ <= ra) {
                            Q && mb[$].isNew && mb[$].render(F, true);
                            mb[$].isActive = true;
                            mb[$].render(F);
                        }
                    });
                    t && u(Ba, function($, F) {
                        if (F % 2 === 0 && $ < ra) {
                            dc[$] || (dc[$] = new w);
                            dc[$].options = { from: $, to: Ba[F + 1] !== Wa ? Ba[F + 1] : ra, color: t };
                            dc[$].render();
                            dc[$].isActive = true;
                        }
                    });
                    J || u((o.plotLines || []).concat(o.plotBands || []), function($) { Pb.push((new w($)).render()); });
                }
                u([mb,
                        Wb, dc], function($) {
                            for (var F in $)
                                if ($[F].isActive) $[F].isActive = false;
                                else {
                                    $[F].destroy();
                                    delete $[F];
                                }
                        });
                if (r) {
                    J = X + (Oa ? Da : 0) + la;
                    E = cb - vb - (Oa ? Aa : 0) + la;
                    J = ga.crispLine([Za, R ? X : J, R ? E : ea, Ka, R ? $a - Ib : J, R ? E : cb - vb], r);
                    if (La) La.animate({ d: J });
                    else La = ga.path(J).attr({ stroke: o.lineColor, "stroke-width": r, zIndex: 7 }).add();
                }
                if (ba) {
                    J = R ? X : ea;
                    r = ja(k.style.fontSize || 12);
                    J = { low: J + (R ? 0 : ya), middle: J + ya / 2, high: J + (R ? ya : 0) }[k.align];
                    r = (R ? ea + Aa : X) + (R ? 1 : -1) * (Oa ? -1 : 1) * nd + (L === 2 ? r : 0);
                    ba[ba.isNew ? "attr" : "animate"]({
                        x: R ? J : r + (Oa ?
                            Da : 0) + la + (k.x || 0),
                        y: R ? r - (Oa ? Aa : 0) + la : J + (k.y || 0)
                    });
                    ba.isNew = false;
                }
                if (n && n.enabled) {
                    var fa, ka;
                    n = I.stackTotalGroup;
                    if (!n) I.stackTotalGroup = n = ga.g("stack-labels").attr({ visibility: Ab, zIndex: 6 }).translate(X, ea).add();
                    for (fa in s) {
                        k = s[fa];
                        for (ka in k) k[ka].render(n);
                    }
                }
                I.isDirty = false;
            }

            function ab(k) {
                for (var n = Pb.length; n--;) Pb[n].id === k && Pb[n].destroy();
            }

            var xa = p.isX, Oa = p.opposite, R = va ? !xa : xa, L = R ? Oa ? 0 : 2 : Oa ? 1 : 3, s = { }, o = Ca(xa ? Yc : od, [ge, he, Td, ie][L], p), I = this, ba, B = o.type, D = B === "datetime", ca = B === "logarithmic",
                la = o.offset || 0, qa = xa ? "x" : "y", ya, fb, Hb, cc = R ? X : vb, G, ha, na, Ra, La, pa, wa, zb, Vb, Gb, ra = null, ia = null, Dc, Sd, Qd = o.minPadding, Rd = o.maxPadding, Ub = K(o.linkedTo), Od, Pd, Vc;
            B = o.events;
            var pd, Pb = [], Ta, Wc, Fb, Ba, mb = { }, Wb = { }, dc = { }, qc, rc, nd, Xc, Ya = o.categories, je = o.labels.formatter || function() {
                var k = this.value;
                return Xc ? Zc(Xc, k) : Ta % 1E6 === 0 ? k / 1E6 + "M" : Ta % 1E3 === 0 ? k / 1E3 + "k" : !Ya && k >= 1E3 ? Ed(k, 0) : k;
            }, $c = R && o.labels.staggerLines, ec = o.reversed, fc = Ya && o.tickmarkPlacement === "between" ? 0.5 : 0;
            q.prototype = {
                addLabel: function() {
                    var k = this.pos,
                        n = o.labels, t = !(k === ia && !A(o.showFirstLabel, 1) || k === ra && !A(o.showLastLabel, 0)), r = Ya && R && Ya.length && !n.step && !n.staggerLines && !n.rotation && Da / Ya.length || !R && Da / 2, J = Ya && K(Ya[k]) ? Ya[k] : k, E = this.label;
                    k = je.call({ isFirst: k === Ba[0], isLast: k === Ba[Ba.length - 1], dateTimeLabelFormat: Xc, value: ca ? Fa.pow(10, J) : J });
                    r = r && { width: Ia(1, W(r - 2 * (n.padding || 10))) + Ua };
                    r = sa(r, n.style);
                    if (E === Wa) this.label = K(k) && t && n.enabled ? ga.text(k, 0, 0, n.useHTML).attr({ align: n.align, rotation: n.rotation }).css(r).add(na) : null;
                    else E && E.attr({ text: k }).css(r);
                },
                getLabelSize: function() {
                    var k = this.label;
                    return k ? (this.labelBBox = k.getBBox())[R ? "height" : "width"] : 0;
                },
                render: function(k, n) {
                    var t = !this.minor, r = this.label, J = this.pos, E = o.labels, Q = this.gridLine, fa = t ? o.gridLineWidth : o.minorGridLineWidth, ka = t ? o.gridLineColor : o.minorGridLineColor, $ = t ? o.gridLineDashStyle : o.minorGridLineDashStyle, F = this.mark, O = t ? o.tickLength : o.minorTickLength, S = t ? o.tickWidth : o.minorTickWidth || 0, aa = t ? o.tickColor : o.minorTickColor, Eb = t ? o.tickPosition : o.minorTickPosition, kb = E.step, nb = n && ad ||
                        cb, Qb;
                    Qb = R ? G(J + fc, null, null, n) + cc : X + la + (Oa ? (n && qd || $a) - Ib - X : 0);
                    nb = R ? nb - vb + la - (Oa ? Aa : 0) : nb - G(J + fc, null, null, n) - cc;
                    if (fa) {
                        J = ha(J + fc, fa, n);
                        if (Q === Wa) {
                            Q = { stroke: ka, "stroke-width": fa };
                            if ($) Q.dashstyle = $;
                            if (t) Q.zIndex = 1;
                            this.gridLine = Q = fa ? ga.path(J).attr(Q).add(Ra) : null;
                        }
                        !n && Q && J && Q.animate({ d: J });
                    }
                    if (S) {
                        if (Eb === "inside") O = -O;
                        if (Oa) O = -O;
                        t = ga.crispLine([Za, Qb, nb, Ka, Qb + (R ? 0 : -O), nb + (R ? O : 0)], S);
                        if (F) F.animate({ d: t });
                        else this.mark = ga.path(t).attr({ stroke: aa, "stroke-width": S }).add(na);
                    }
                    if (r && !isNaN(Qb)) {
                        Qb = Qb +
                            E.x - (fc && R ? fc * fb * (ec ? -1 : 1) : 0);
                        nb = nb + E.y - (fc && !R ? fc * fb * (ec ? 1 : -1) : 0);
                        K(E.y) || (nb += ja(r.styles.lineHeight) * 0.9 - r.getBBox().height / 2);
                        if ($c) nb += k / (kb || 1) % $c * 16;
                        if (kb) r[k % kb ? "hide" : "show"]();
                        r[this.isNew ? "attr" : "animate"]({ x: Qb, y: nb });
                    }
                    this.isNew = false;
                },
                destroy: function() { Ac(this); }
            };
            w.prototype = {
                render: function() {
                    var k = this, n = k.options, t = n.label, r = k.label, J = n.width, E = n.to, Q = n.from, fa = n.value, ka, $ = n.dashStyle, F = k.svgElem, O = [], S, aa, Eb = n.color;
                    aa = n.zIndex;
                    var kb = n.events;
                    if (ca) {
                        Q = mc(Q);
                        E = mc(E);
                        fa = mc(fa);
                    }
                    if (J) {
                        O =
                            ha(fa, J);
                        n = { stroke: Eb, "stroke-width": J };
                        if ($) n.dashstyle = $;
                    } else if (K(Q) && K(E)) {
                        Q = Ia(Q, ia);
                        E = tb(E, ra);
                        ka = ha(E);
                        if ((O = ha(Q)) && ka) O.push(ka[4], ka[5], ka[1], ka[2]);
                        else O = null;
                        n = { fill: Eb };
                    } else return;
                    if (K(aa)) n.zIndex = aa;
                    if (F)
                        if (O) F.animate({ d: O }, null, F.onGetPath);
                        else {
                            F.hide();
                            F.onGetPath = function() { F.show(); };
                        }
                    else if (O && O.length) {
                        k.svgElem = F = ga.path(O).attr(n).add();
                        if (kb) {
                            $ = function(nb) { F.on(nb, function(Qb) { kb[nb].apply(k, [Qb]); }); };
                            for (S in kb) $(S);
                        }
                    }
                    if (t && K(t.text) && O && O.length && Da > 0 && Aa > 0) {
                        t = Ca({
                            align: R &&
                            ka && "center",
                            x: R ? !ka && 4 : 10,
                            verticalAlign: !R && ka && "middle",
                            y: R ? ka ? 16 : 10 : ka ? 6 : -4,
                            rotation: R && !ka && 90
                        }, t);
                        if (!r) k.label = r = ga.text(t.text, 0, 0).attr({ align: t.textAlign || t.align, rotation: t.rotation, zIndex: aa }).css(t.style).add();
                        ka = [O[1], O[4], A(O[6], O[1])];
                        O = [O[2], O[5], A(O[7], O[2])];
                        S = tb.apply(Fa, ka);
                        aa = tb.apply(Fa, O);
                        r.align(t, false, { x: S, y: aa, width: Ia.apply(Fa, ka) - S, height: Ia.apply(Fa, O) - aa });
                        r.show();
                    } else r && r.hide();
                    return k;
                },
                destroy: function() {
                    Ac(this);
                    nc(Pb, this);
                }
            };
            x.prototype = {
                destroy: function() { Ac(this); },
                setTotal: function(k) { this.cum = this.total = k; },
                render: function(k) {
                    var n = this.options.formatter.call(this);
                    if (this.label) this.label.attr({ text: n, visibility: ob });
                    else this.label = l.renderer.text(n, 0, 0).css(this.options.style).attr({ align: this.textAlign, rotation: this.options.rotation, visibility: ob }).add(k);
                },
                setOffset: function(k, n) {
                    var t = this.isNegative, r = I.translate(this.total), J = I.translate(0);
                    J = bb(r - J);
                    var E = l.xAxis[0].translate(this.x) + k, Q = l.plotHeight;
                    t = {
                        x: va ? t ? r : r - J : E,
                        y: va ? Q - E - n : t ? Q - r - J : Q - r,
                        width: va ?
                            J : n,
                        height: va ? n : J
                    };
                    this.label && this.label.align(this.alignOptions, null, t).attr({ visibility: Ab });
                }
            };
            G = function(k, n, t, r, J) {
                var E = 1, Q = 0, fa = r ? Hb : fb;
                r = r ? Dc : ia;
                fa || (fa = fb);
                if (t) {
                    E *= -1;
                    Q = ya;
                }
                if (ec) {
                    E *= -1;
                    Q -= E * ya;
                }
                if (n) {
                    if (ec) k = ya - k;
                    k = k / fa + r;
                    if (ca && J) k = Fa.pow(10, k);
                } else {
                    if (ca && J) k = mc(k);
                    k = E * (k - r) * fa + Q;
                }
                return k;
            };
            ha = function(k, n, t) {
                var r, J, E;
                k = G(k, null, null, t);
                var Q = t && ad || cb, fa = t && qd || $a, ka;
                t = J = W(k + cc);
                r = E = W(Q - k - cc);
                if (isNaN(k)) ka = true;
                else if (R) {
                    r = ea;
                    E = Q - vb;
                    if (t < X || t > X + Da) ka = true;
                } else {
                    t = X;
                    J = fa - Ib;
                    if (r < ea || r >
                        ea + Aa) ka = true;
                }
                return ka ? null : ga.crispLine([Za, t, r, Ka, J, E], n || 0);
            };
            if (va && xa && ec === Wa) ec = true;
            sa(I, {
                addPlotBand: za,
                addPlotLine: za,
                adjustTickAmount: function() {
                    if (Ob && !D && !Ya && !Ub) {
                        var k = qc, n = Ba.length;
                        qc = Ob[qa];
                        if (n < qc) {
                            for (; Ba.length < qc;) Ba.push(ta(Ba[Ba.length - 1] + Ta));
                            fb *= (n - 1) / (qc - 1);
                            ra = Ba[Ba.length - 1];
                        }
                        if (K(k) && qc !== k) I.isDirty = true;
                    }
                },
                categories: Ya,
                getExtremes: function() { return { min: ia, max: ra, dataMin: pa, dataMax: wa, userMin: Vb, userMax: Gb }; },
                getPlotLinePath: ha,
                getThreshold: function(k) {
                    if (ia > k) k = ia;
                    else if (ra <
                        k) k = ra;
                    return G(k, 0, 1);
                },
                isXAxis: xa,
                options: o,
                plotLinesAndBands: Pb,
                getOffset: function() {
                    var k = zb.length && K(ia) && K(ra), n = 0, t = 0, r = o.title, J = o.labels, E = [-1, 1, 1, -1][L], Q;
                    if (!na) {
                        na = ga.g("axis").attr({ zIndex: 7 }).add();
                        Ra = ga.g("grid").attr({ zIndex: 1 }).add();
                    }
                    rc = 0;
                    if (k || Ub) {
                        u(Ba, function(fa) {
                            if (mb[fa]) mb[fa].addLabel();
                            else mb[fa] = new q(fa);
                            if (L === 0 || L === 2 || { 1: "left", 3: "right" }[L] === J.align) rc = Ia(mb[fa].getLabelSize(), rc);
                        });
                        if ($c) rc += ($c - 1) * 16;
                    } else
                        for (Q in mb) {
                            mb[Q].destroy();
                            delete mb[Q];
                        }
                    if (r && r.text) {
                        if (!ba) {
                            ba =
                                I.axisTitle = ga.text(r.text, 0, 0, r.useHTML).attr({ zIndex: 7, rotation: r.rotation || 0, align: r.textAlign || { low: "left", middle: "center", high: "right" }[r.align] }).css(r.style).add();
                            ba.isNew = true;
                        }
                        n = ba.getBBox()[R ? "height" : "width"];
                        t = A(r.margin, R ? 5 : 10);
                    }
                    la = E * (o.offset || Xb[L]);
                    nd = rc + (L !== 2 && rc && E * o.labels[R ? "y" : "x"]) + t;
                    Xb[L] = Ia(Xb[L], nd + n + E * la);
                },
                render: eb,
                setCategories: function(k, n) {
                    I.categories = p.categories = Ya = k;
                    u(zb, function(t) {
                        t.translate();
                        t.setTooltipPoints(true);
                    });
                    I.isDirty = true;
                    A(n, true) && l.redraw();
                },
                setExtremes: function(k,
                    n, t, r) {
                    t = A(t, true);
                    Pa(I, "setExtremes", { min: k, max: n }, function() {
                        Vb = k;
                        Gb = n;
                        t && l.redraw(r);
                    });
                },
                setScale: Ma,
                setTickPositions: da,
                translate: G,
                redraw: function() {
                    Yb.resetTracker && Yb.resetTracker();
                    eb();
                    u(Pb, function(k) { k.render(); });
                    u(zb, function(k) { k.isDirty = true; });
                },
                removePlotBand: ab,
                removePlotLine: ab,
                reversed: ec,
                stacks: s,
                destroy: function() {
                    var k;
                    pb(I);
                    for (k in s) {
                        Ac(s[k]);
                        s[k] = null;
                    }
                    if (I.stackTotalGroup) I.stackTotalGroup = I.stackTotalGroup.destroy();
                    u([mb, Wb, dc, Pb], function(n) { Ac(n); });
                    u([La, na, Ra, ba], function(n) {
                        n &&
                            n.destroy();
                    });
                    La = na = Ra = ba = null;
                }
            });
            for (pd in B) Qa(I, pd, B[pd]);
            Ma();
        }

        function d() {
            var p = { };
            return {
                add: function(q, w, x, V) {
                    if (!p[q]) {
                        w = ga.text(w, 0, 0).css(a.toolbar.itemStyle).align({ align: "right", x: -Ib - 20, y: ea + 30 }).on("click", V).attr({ align: "right", zIndex: 20 }).add();
                        p[q] = w;
                    }
                },
                remove: function(q) {
                    pc(p[q].element);
                    p[q] = null;
                }
            };
        }

        function e(p) {

            function q() {
                var B = this.points || zc(this), D = B[0].series.xAxis, ca = this.x;
                D = D && D.options.type === "datetime";
                var la = Sb(ca) || D, qa;
                qa = la ? ['<span style="font-size: 10px">' + (D ? Zc("%A, %b %e, %Y",
                    ca) : ca) + "</span>"] : [];
                u(B, function(ya) { qa.push(ya.point.tooltipFormatter(la)); });
                return qa.join("<br/>");
            }

            function w(B, D) {
                L = xa ? B : (2 * L + B) / 3;
                s = xa ? D : (s + D) / 2;
                o.translate(L, s);
                rd = bb(B - L) > 1 || bb(D - s) > 1 ? function() { w(B, D); } : null;
            }

            function x() {
                if (!xa) {
                    var B = l.hoverPoints;
                    o.hide();
                    u(da, function(D) { D && D.hide(); });
                    B && u(B, function(D) { D.setState(); });
                    l.hoverPoints = null;
                    xa = true;
                }
            }

            var V, N = p.borderWidth, ta = p.crosshairs, da = [], Ma = p.style, za = p.shared, eb = ja(Ma.padding), ab = N + eb, xa = true, Oa, R, L = 0, s = 0;
            Ma.padding = 0;
            var o = ga.g("tooltip").attr({ zIndex: 8 }).add(),
                I = ga.rect(ab, ab, 0, 0, p.borderRadius, N).attr({ fill: p.backgroundColor, "stroke-width": N }).add(o).shadow(p.shadow), ba = ga.text("", eb + ab, ja(Ma.fontSize) + eb + ab, p.useHTML).attr({ zIndex: 1 }).css(Ma).add(o);
            o.hide();
            return {
                shared: za,
                refresh: function(B) {
                    var D, ca, la, qa = 0, ya = { }, fb = [];
                    la = B.tooltipPos;
                    D = p.formatter || q;
                    ya = l.hoverPoints;
                    if (za) {
                        ya && u(ya, function(Hb) { Hb.setState(); });
                        l.hoverPoints = B;
                        u(B, function(Hb) {
                            Hb.setState(Bb);
                            qa += Hb.plotY;
                            fb.push(Hb.getLabelConfig());
                        });
                        ca = B[0].plotX;
                        qa = W(qa) / B.length;
                        ya = { x: B[0].category };
                        ya.points = fb;
                        B = B[0];
                    } else ya = B.getLabelConfig();
                    ya = D.call(ya);
                    V = B.series;
                    ca = za ? ca : B.plotX;
                    qa = za ? qa : B.plotY;
                    D = W(la ? la[0] : va ? Da - qa : ca);
                    ca = W(la ? la[1] : va ? Aa - ca : qa);
                    la = za || !B.series.isCartesian || gc(D, ca);
                    if (ya === false || !la) x();
                    else {
                        if (xa) {
                            o.show();
                            xa = false;
                        }
                        ba.attr({ text: ya });
                        la = ba.getBBox();
                        Oa = la.width + 2 * eb;
                        R = la.height + 2 * eb;
                        I.attr({ width: Oa, height: R, stroke: p.borderColor || B.color || V.color || "#606060" });
                        D = fe(Oa, R, X, ea, Da, Aa, { x: D, y: ca });
                        w(W(D.x - ab), W(D.y - ab));
                    }
                    if (ta) {
                        ta = zc(ta);
                        for (D = ta.length; D--;) {
                            ca = B.series[D ?
                                "yAxis" : "xAxis"];
                            if (ta[D] && ca) {
                                ca = ca.getPlotLinePath(B[D ? "y" : "x"], 1);
                                if (da[D]) da[D].attr({ d: ca, visibility: Ab });
                                else {
                                    la = { "stroke-width": ta[D].width || 1, stroke: ta[D].color || "#C0C0C0", zIndex: 2 };
                                    if (ta[D].dashStyle) la.dashstyle = ta[D].dashStyle;
                                    da[D] = ga.path(ca).attr(la).add();
                                }
                            }
                        }
                    }
                },
                hide: x,
                destroy: function() {
                    u(da, function(B) { B && B.destroy(); });
                    u([I, ba, o], function(B) { B && B.destroy(); });
                    I = ba = o = null;
                }
            };
        }

        function f(p) {

            function q(L) {
                var s, o = Ud && ua.width / ua.body.scrollWidth - 1, I, ba, B;
                L = L || db.event;
                if (!L.target)
                    L.target =
                        L.srcElement;
                s = L.touches ? L.touches.item(0) : L;
                if (L.type !== "mousemove" || db.opera || o) {
                    Jb = Fd(oa);
                    I = Jb.left;
                    ba = Jb.top;
                }
                if (Pc) {
                    B = L.x;
                    s = L.y;
                } else if (s.layerX === Wa) {
                    B = s.pageX - I;
                    s = s.pageY - ba;
                } else {
                    B = L.layerX;
                    s = L.layerY;
                }
                if (o) {
                    B += W((o + 1) * I - I);
                    s += W((o + 1) * ba - ba);
                }
                return sa(L, { chartX: B, chartY: s });
            }

            function w(L) {
                var s = { xAxis: [], yAxis: [] };
                u(Va, function(o) {
                    var I = o.translate, ba = o.isXAxis;
                    s[ba ? "xAxis" : "yAxis"].push({ axis: o, value: I((va ? !ba : ba) ? L.chartX - X : Aa - L.chartY + ea, true) });
                });
                return s;
            }

            function x() {
                var L = l.hoverSeries,
                    s = l.hoverPoint;
                s && s.onMouseOut();
                L && L.onMouseOut();
                hc && hc.hide();
                sd = null;
            }

            function V() {
                if (za) {
                    var L = { xAxis: [], yAxis: [] }, s = za.getBBox(), o = s.x - X, I = s.y - ea;
                    if (Ma) {
                        u(Va, function(ba) {
                            var B = ba.translate, D = ba.isXAxis, ca = va ? !D : D, la = B(ca ? o : Aa - I - s.height, true, 0, 0, 1);
                            B = B(ca ? o + s.width : Aa - I, true, 0, 0, 1);
                            L[D ? "xAxis" : "yAxis"].push({ axis: ba, min: tb(la, B), max: Ia(la, B) });
                        });
                        Pa(l, "selection", L, td);
                    }
                    za = za.destroy();
                }
                l.mouseIsDown = ud = Ma = false;
                pb(ua, Kb ? "touchend" : "mouseup", V);
            }

            function N(L) {
                var s = K(L.pageX) ? L.pageX : L.page.x;
                L =
                    K(L.pageX) ? L.pageY : L.page.y;
                Jb && !gc(s - Jb.left - X, L - Jb.top - ea) && x();
            }

            var ta, da, Ma, za, eb = z.zoomType, ab = /x/ .test(eb), xa = /y/ .test(eb), Oa = ab && !va || xa && va, R = xa && !va || ab && va;
            bd = function() {
                if (Ec) {
                    Ec.translate(X, ea);
                    va && Ec.attr({ width: l.plotWidth, height: l.plotHeight }).invert();
                } else l.trackerGroup = Ec = ga.g("tracker").attr({ zIndex: 9 }).add();
            };
            bd();
            if (p.enabled) l.tooltip = hc = e(p);
            (function() {
                oa.onmousedown = function(s) {
                    s = q(s);
                    !Kb && s.preventDefault && s.preventDefault();
                    l.mouseIsDown = ud = true;
                    ta = s.chartX;
                    da = s.chartY;
                    Qa(ua,
                        Kb ? "touchend" : "mouseup", V);
                };
                var L = function(s) {
                    if (!(s && s.touches && s.touches.length > 1)) {
                        s = q(s);
                        if (!Kb) s.returnValue = false;
                        var o = s.chartX, I = s.chartY, ba = !gc(o - X, I - ea);
                        Jb || (Jb = Fd(oa));
                        if (Kb && s.type === "touchstart")
                            if (Ga(s.target, "isTracker")) l.runTrackerClick || s.preventDefault();
                            else !ke && !ba && s.preventDefault();
                        if (ba) {
                            if (o < X) o = X;
                            else if (o > X + Da) o = X + Da;
                            if (I < ea) I = ea;
                            else if (I > ea + Aa) I = ea + Aa;
                        }
                        if (ud && s.type !== "touchstart") {
                            Ma = Math.sqrt(Math.pow(ta - o, 2) + Math.pow(da - I, 2));
                            if (Ma > 10) {
                                if (sc && (ab || xa) && gc(ta - X, da - ea))
                                    za ||
                                        (za = ga.rect(X, ea, Oa ? 1 : Da, R ? 1 : Aa, 0).attr({ fill: z.selectionMarkerFill || "rgba(69,114,167,0.25)", zIndex: 7 }).add());
                                if (za && Oa) {
                                    o = o - ta;
                                    za.attr({ width: bb(o), x: (o > 0 ? 0 : o) + ta });
                                }
                                if (za && R) {
                                    I = I - da;
                                    za.attr({ height: bb(I), y: (I > 0 ? 0 : I) + da });
                                }
                            }
                        } else if (!ba) {
                            var B;
                            I = l.hoverPoint;
                            o = l.hoverSeries;
                            var D, ca, la = $a, qa = va ? s.chartY : s.chartX - X;
                            if (hc && p.shared) {
                                B = [];
                                D = Ha.length;
                                for (ca = 0; ca < D; ca++)
                                    if (Ha[ca].visible && Ha[ca].tooltipPoints.length) {
                                        s = Ha[ca].tooltipPoints[qa];
                                        s._dist = bb(qa - s.plotX);
                                        la = tb(la, s._dist);
                                        B.push(s);
                                    }
                                for (D =
                                    B.length; D--;) B[D]._dist > la && B.splice(D, 1);
                                if (B.length && B[0].plotX !== sd) {
                                    hc.refresh(B);
                                    sd = B[0].plotX;
                                }
                            }
                            if (o && o.tracker) (s = o.tooltipPoints[qa]) && s !== I && s.onMouseOver();
                        }
                        return ba || !sc;
                    }
                };
                oa.onmousemove = L;
                Qa(oa, "mouseleave", x);
                Qa(ua, "mousemove", N);
                oa.ontouchstart = function(s) {
                    if (ab || xa) oa.onmousedown(s);
                    L(s);
                };
                oa.ontouchmove = L;
                oa.ontouchend = function() { Ma && x(); };
                oa.onclick = function(s) {
                    var o = l.hoverPoint;
                    s = q(s);
                    s.cancelBubble = true;
                    if (!Ma)
                        if (o && Ga(s.target, "isTracker")) {
                            var I = o.plotX, ba = o.plotY;
                            sa(o, {
                                pageX: Jb.left +
                                X + (va ? Da - ba : I),
                                pageY: Jb.top + ea + (va ? Aa - I : ba)
                            });
                            Pa(o.series, "click", sa(s, { point: o }));
                            o.firePointEvent("click", s);
                        } else {
                            sa(s, w(s));
                            gc(s.chartX - X, s.chartY - ea) && Pa(l, "click", s);
                        }
                    Ma = false;
                };
            })();
            Vd = setInterval(function() { rd && rd(); }, 32);
            sa(this, {
                zoomX: ab,
                zoomY: xa,
                resetTracker: x,
                destroy: function() {
                    if (l.trackerGroup) l.trackerGroup = Ec = l.trackerGroup.destroy();
                    pb(ua, "mousemove", N);
                    oa.onclick = oa.onmousedown = oa.onmousemove = oa.ontouchstart = oa.ontouchend = oa.ontouchmove = null;
                }
            });
        }

        function g(p) {
            var q = p.type || z.type || z.defaultSeriesType,
                w = wb[q], x = l.hasRendered;
            if (x)
                if (va && q === "column") w = wb.bar;
                else if (!va && q === "bar") w = wb.column;
            q = new w;
            q.init(l, p);
            if (!x && q.inverted) va = true;
            if (q.isCartesian) sc = q.isCartesian;
            Ha.push(q);
            return q;
        }

        function h() {
            z.alignTicks !== false && u(Va, function(p) { p.adjustTickAmount(); });
            Ob = null;
        }

        function i(p) {
            var q = l.isDirtyLegend, w, x = l.isDirtyBox, V = Ha.length, N = V, ta = l.clipRect;
            for (oc(p, l); N--;) {
                p = Ha[N];
                if (p.isDirty && p.options.stacking) {
                    w = true;
                    break;
                }
            }
            if (w)
                for (N = V; N--;) {
                    p = Ha[N];
                    if (p.options.stacking) p.isDirty = true;
                }
            u(Ha,
                function(da) {
                    if (da.isDirty) {
                        da.cleanData();
                        da.getSegments();
                        if (da.options.legendType === "point") q = true;
                    }
                });
            if (q && Fc.renderLegend) {
                Fc.renderLegend();
                l.isDirtyLegend = false;
            }
            if (sc) {
                if (!cd) {
                    Ob = null;
                    u(Va, function(da) { da.setScale(); });
                }
                h();
                Gc();
                u(Va, function(da) {
                    if (da.isDirty || x) {
                        da.redraw();
                        x = true;
                    }
                });
            }
            if (x) {
                vd();
                bd();
                if (ta) {
                    Hc(ta);
                    ta.animate({ width: l.plotSizeX, height: l.plotSizeY });
                }
            }
            u(Ha, function(da) { if (da.isDirty && da.visible && (!da.isCartesian || da.xAxis)) da.redraw(); });
            Yb && Yb.resetTracker && Yb.resetTracker();
            Pa(l,
                "redraw");
        }

        function j() {
            var p = a.xAxis || { }, q = a.yAxis || { }, w;
            p = zc(p);
            u(p, function(x, V) {
                x.index = V;
                x.isX = true;
            });
            q = zc(q);
            u(q, function(x, V) { x.index = V; });
            Va = p.concat(q);
            l.xAxis = [];
            l.yAxis = [];
            Va = tc(Va, function(x) {
                w = new c(x);
                l[w.isXAxis ? "xAxis" : "yAxis"].push(w);
                return w;
            });
            h();
        }

        function m(p, q) {
            uc = Ca(a.title, p);
            Ic = Ca(a.subtitle, q);
            u([["title", p, uc], ["subtitle", q, Ic]], function(w) {
                var x = w[0], V = l[x], N = w[1];
                w = w[2];
                if (V && N) V = V.destroy();
                if (w && w.text && !V)
                    l[x] = ga.text(w.text, 0, 0, w.useHTML).attr({
                        align: w.align,
                        "class": "highcharts-" +
                        x,
                        zIndex: 1
                    }).css(w.style).add().align(w, false, Rb);
            });
        }

        function v() {
            qb = z.renderTo;
            Wd = vc + wd++;
            if (Sb(qb)) qb = ua.getElementById(qb);
            qb.innerHTML = "";
            if (!qb.offsetWidth) {
                Zb = qb.cloneNode(0);
                Ja(Zb, { position: ic, top: "-9999px", display: "" });
                ua.body.appendChild(Zb);
            }
            dd = (Zb || qb).offsetWidth;
            Jc = (Zb || qb).offsetHeight;
            l.chartWidth = $a = z.width || dd || 600;
            l.chartHeight = cb = z.height || (Jc > 19 ? Jc : 400);
            l.container = oa = hb(Tb, { className: "highcharts-container" + (z.className ? " " + z.className : ""), id: Wd }, sa({
                position: Xd,
                overflow: ob,
                width: $a +
                Ua,
                height: cb + Ua,
                textAlign: "left"
            }, z.style), Zb || qb);
            l.renderer = ga = z.forExport ? new ed(oa, $a, cb, true) : new fd(oa, $a, cb);
            var p, q;
            if (Yd && oa.getBoundingClientRect) {
                p = function() {
                    Ja(oa, { left: 0, top: 0 });
                    q = oa.getBoundingClientRect();
                    Ja(oa, { left: -(q.left - ja(q.left)) + Ua, top: -(q.top - ja(q.top)) + Ua });
                };
                p();
                Qa(db, "resize", p);
                Qa(l, "destroy", function() { pb(db, "resize", p); });
            }
        }

        function P() {

            function p() {
                var w = z.width || qb.offsetWidth, x = z.height || qb.offsetHeight;
                if (w && x) {
                    if (w !== dd || x !== Jc) {
                        clearTimeout(q);
                        q = setTimeout(function() {
                            xd(w,
                                x, false);
                        }, 100);
                    }
                    dd = w;
                    Jc = x;
                }
            }

            var q;
            Qa(db, "resize", p);
            Qa(l, "destroy", function() { pb(db, "resize", p); });
        }

        function T() {
            Pa(l, "endResize", null, function() { cd -= 1; });
        }

        function Y() {
            var p = a.labels, q = a.credits, w;
            m();
            Fc = l.legend = new le;
            Gc();
            u(Va, function(x) { x.setTickPositions(true); });
            h();
            Gc();
            vd();
            sc && u(Va, function(x) { x.render(); });
            if (!l.seriesGroup) l.seriesGroup = ga.g("series-group").attr({ zIndex: 3 }).add();
            u(Ha, function(x) {
                x.translate();
                x.setTooltipPoints();
                x.render();
            });
            p.items && u(p.items, function() {
                var x = sa(p.style, this.style),
                    V = ja(x.left) + X, N = ja(x.top) + ea + 12;
                delete x.left;
                delete x.top;
                ga.text(this.html, V, N).attr({ zIndex: 2 }).css(x).add();
            });
            if (!l.toolbar) l.toolbar = d();
            if (q.enabled && !l.credits) {
                w = q.href;
                l.credits = ga.text(q.text, 0, 0).on("click", function() { if (w) location.href = w; }).attr({ align: q.position.align, zIndex: 8 }).css(q.style).add().align(q.position);
            }
            bd();
            l.hasRendered = true;
            if (Zb) {
                qb.appendChild(oa);
                pc(Zb);
            }
        }

        function H() {
            var p, q = oa && oa.parentNode;
            if (l !== null) {
                Pa(l, "destroy");
                pb(db, "unload", H);
                pb(l);
                for (p = Va.length; p--;)
                    Va[p] =
                        Va[p].destroy();
                for (p = Ha.length; p--;) Ha[p] = Ha[p].destroy();
                u(["title", "subtitle", "seriesGroup", "clipRect", "credits", "tracker"], function(w) {
                    var x = l[w];
                    if (x) l[w] = x.destroy();
                });
                u([wc, xc, Kc, Fc, hc, ga, Yb], function(w) { w && w.destroy && w.destroy(); });
                wc = xc = Kc = Fc = hc = ga = Yb = null;
                if (oa) {
                    oa.innerHTML = "";
                    pb(oa);
                    q && pc(oa);
                    oa = null;
                }
                clearInterval(Vd);
                for (p in l) delete l[p];
                l = null;
            }
        }

        function U() {
            if (!Lc && db == db.top && ua.readyState !== "complete")
                ua.attachEvent("onreadystatechange", function() {
                    ua.detachEvent("onreadystatechange",
                        U);
                    ua.readyState === "complete" && U();
                });
            else {
                v();
                yd();
                zd();
                u(a.series || [], function(p) { g(p); });
                l.inverted = va = A(va, a.chart.inverted);
                j();
                l.render = Y;
                l.tracker = Yb = new f(a.tooltip);
                Y();
                Pa(l, "load");
                b && b.apply(l, [l]);
                u(l.callbacks, function(p) { p.apply(l, [l]); });
            }
        }

        Yc = Ca(Yc, Xa.xAxis);
        od = Ca(od, Xa.yAxis);
        Xa.xAxis = Xa.yAxis = null;
        a = Ca(Xa, a);
        var z = a.chart, M = z.margin;
        M = Nb(M) ? M : [M, M, M, M];
        var y = A(z.marginTop, M[0]), C = A(z.marginRight, M[1]), Z = A(z.marginBottom, M[2]), Sa = A(z.marginLeft, M[3]), Na = z.spacingTop, Ea = z.spacingRight,
            gb = z.spacingBottom, Lb = z.spacingLeft, Rb, uc, Ic, ea, Ib, vb, X, Xb, qb, Zb, oa, Wd, dd, Jc, $a, cb, qd, ad, wc, Kc, Ad, xc, l = this, ke = (M = z.events) && !!M.click, Bd, gc, hc, ud, jc, Zd, Cd, Aa, Da, Yb, Ec, bd, Fc, $b, ac, Jb, sc = z.showAxes, cd = 0, Va = [], Ob, Ha = [], va, ga, rd, Vd, sd, vd, Gc, yd, zd, xd, td, $d, le = function() {

                function p(G, ha) {
                    var na = G.legendItem, Ra = G.legendLine, La = G.legendSymbol, pa = Oa.color, wa = ha ? N.itemStyle.color : pa, zb = ha ? G.color : pa;
                    pa = ha ? G.pointAttr[ib] : { stroke: pa, fill: pa };
                    na && na.css({ fill: wa });
                    Ra && Ra.attr({ stroke: zb });
                    La && La.attr(pa);
                }

                function q(G,
                    ha, na) {
                    var Ra = G.legendItem, La = G.legendLine, pa = G.legendSymbol;
                    G = G.checkbox;
                    Ra && Ra.attr({ x: ha, y: na });
                    La && La.translate(ha, na - 4);
                    pa && pa.attr({ x: ha + pa.xOff, y: na + pa.yOff });
                    if (G) {
                        G.x = ha;
                        G.y = na;
                    }
                }

                function w() {
                    u(za, function(G) {
                        var ha = G.checkbox, na = qa.alignAttr;
                        ha && Ja(ha, { left: na.translateX + G.legendItemWidth + ha.x - 40 + Ua, top: na.translateY + ha.y - 11 + Ua });
                    });
                }

                function x(G) {
                    var ha, na, Ra, La, pa = G.legendItem;
                    La = G.series || G;
                    var wa = La.options, zb = wa && wa.borderWidth || 0;
                    if (!pa) {
                        La = /^(bar|pie|area|column)$/ .test(La.type);
                        G.legendItem =
                            pa = ga.text(N.labelFormatter.call(G), 0, 0).css(G.visible ? ab : Oa).on("mouseover", function() {
                                G.setState(Bb);
                                pa.css(xa);
                            }).on("mouseout", function() {
                                pa.css(G.visible ? ab : Oa);
                                G.setState();
                            }).on("click", function() {
                                var Gb = function() { G.setVisible(); };
                                G.firePointEvent ? G.firePointEvent("legendItemClick", null, Gb) : Pa(G, "legendItemClick", null, Gb);
                            }).attr({ zIndex: 2 }).add(qa);
                        if (!La && wa && wa.lineWidth) {
                            var Vb = { "stroke-width": wa.lineWidth, zIndex: 2 };
                            if (wa.dashStyle) Vb.dashstyle = wa.dashStyle;
                            G.legendLine = ga.path([Za, -da - Ma,
                                    0, Ka, -Ma, 0]).attr(Vb).add(qa);
                        }
                        if (La) ha = ga.rect(na = -da - Ma, Ra = -11, da, 12, 2).attr({ zIndex: 3 }).add(qa);
                        else if (wa && wa.marker && wa.marker.enabled) ha = ga.symbol(G.symbol, na = -da / 2 - Ma, Ra = -4, wa.marker.radius).attr({ zIndex: 3 }).add(qa);
                        if (ha) {
                            ha.xOff = na + zb % 2 / 2;
                            ha.yOff = Ra + zb % 2 / 2;
                        }
                        G.legendSymbol = ha;
                        p(G, G.visible);
                        if (wa && wa.showCheckbox) {
                            G.checkbox = hb("input", { type: "checkbox", checked: G.selected, defaultChecked: G.selected }, N.itemCheckboxStyle, oa);
                            Qa(G.checkbox, "click", function(Gb) {
                                Pa(G, "checkboxClick", { checked: Gb.target.checked },
                                    function() { G.select(); });
                            });
                        }
                    }
                    ha = pa.getBBox();
                    na = G.legendItemWidth = N.itemWidth || da + Ma + ha.width + R;
                    B = ha.height;
                    if (ta && o - s + na > (fb || $a - 2 * R - s)) {
                        o = s;
                        I += B;
                    }
                    ba = I;
                    q(G, o, I);
                    if (ta) o += na;
                    else I += B;
                    ya = fb || Ia(ta ? o - s : na, ya);
                }

                function V() {
                    o = s;
                    I = L;
                    ba = ya = 0;
                    qa || (qa = ga.g("legend").attr({ zIndex: 7 }).add());
                    za = [];
                    u(Hb, function(Ra) {
                        var La = Ra.options;
                        if (La.showInLegend) za = za.concat(La.legendType === "point" ? Ra.data : Ra);
                    });
                    Hd(za, function(Ra, La) { return (Ra.options.legendIndex || 0) - (La.options.legendIndex || 0); });
                    cc && za.reverse();
                    u(za,
                        x);
                    $b = fb || ya;
                    ac = ba - L + B;
                    if (ca || la) {
                        $b += 2 * R;
                        ac += 2 * R;
                        if (D) {
                            if ($b > 0 && ac > 0) {
                                D[D.isNew ? "attr" : "animate"](D.crisp(null, null, null, $b, ac));
                                D.isNew = false;
                            }
                        } else {
                            D = ga.rect(0, 0, $b, ac, N.borderRadius, ca || 0).attr({ stroke: N.borderColor, "stroke-width": ca || 0, fill: la || jb }).add(qa).shadow(N.shadow);
                            D.isNew = true;
                        }
                        D[za.length ? "show" : "hide"]();
                    }
                    for (var G = ["left", "right", "top", "bottom"], ha, na = 4; na--;) {
                        ha = G[na];
                        if (eb[ha] && eb[ha] !== "auto") {
                            N[na < 2 ? "align" : "verticalAlign"] = ha;
                            N[na < 2 ? "x" : "y"] = ja(eb[ha]) * (na % 2 ? -1 : 1);
                        }
                    }
                    za.length &&
                        qa.align(sa(N, { width: $b, height: ac }), true, Rb);
                    cd || w();
                }

                var N = l.options.legend;
                if (N.enabled) {
                    var ta = N.layout === "horizontal", da = N.symbolWidth, Ma = N.symbolPadding, za, eb = N.style, ab = N.itemStyle, xa = N.itemHoverStyle, Oa = N.itemHiddenStyle, R = ja(eb.padding), L = 18, s = 4 + R + da + Ma, o, I, ba, B = 0, D, ca = N.borderWidth, la = N.backgroundColor, qa, ya, fb = N.width, Hb = l.series, cc = N.reversed;
                    V();
                    Qa(l, "endResize", w);
                    return {
                        colorizeItem: p,
                        destroyItem: function(G) {
                            var ha = G.checkbox;
                            u(["legendItem", "legendLine", "legendSymbol"], function(na) {
                                G[na] &&
                                    G[na].destroy();
                            });
                            ha && pc(G.checkbox);
                        },
                        renderLegend: V,
                        destroy: function() {
                            if (D) D = D.destroy();
                            if (qa) qa = qa.destroy();
                        }
                    };
                }
            };
        gc = function(p, q) { return p >= 0 && p <= Da && q >= 0 && q <= Aa; };
        $d = function() {
            Pa(l, "selection", { resetSelection: true }, td);
            l.toolbar.remove("zoom");
        };
        td = function(p) {
            var q = Xa.lang, w = l.pointCount < 100;
            l.toolbar.add("zoom", q.resetZoom, q.resetZoomTitle, $d);
            !p || p.resetSelection ? u(Va, function(x) { x.setExtremes(null, null, false, w); }) : u(p.xAxis.concat(p.yAxis), function(x) {
                var V = x.axis;
                if (l.tracker[V.isXAxis ? "zoomX" :
                    "zoomY"]) V.setExtremes(x.min, x.max, false, w);
            });
            i();
        };
        Gc = function() {
            var p = a.legend, q = A(p.margin, 10), w = p.x, x = p.y, V = p.align, N = p.verticalAlign, ta;
            yd();
            if ((l.title || l.subtitle) && !K(y)) if (ta = Ia(l.title && !uc.floating && !uc.verticalAlign && uc.y || 0, l.subtitle && !Ic.floating && !Ic.verticalAlign && Ic.y || 0)) ea = Ia(ea, ta + A(uc.margin, 15) + Na);
            if (p.enabled && !p.floating)
                if (V === "right") K(C) || (Ib = Ia(Ib, $b - w + q + Ea));
                else if (V === "left") K(Sa) || (X = Ia(X, $b + w + q + Lb));
                else if (N === "top") K(y) || (ea = Ia(ea, ac + x + q + Na));
                else if (N === "bottom")
                    K(Z) ||
                        (vb = Ia(vb, ac - x + q + gb));
            sc && u(Va, function(da) { da.getOffset(); });
            K(Sa) || (X += Xb[3]);
            K(y) || (ea += Xb[0]);
            K(Z) || (vb += Xb[2]);
            K(C) || (Ib += Xb[1]);
            zd();
        };
        xd = function(p, q, w) {
            var x = l.title, V = l.subtitle;
            cd += 1;
            oc(w, l);
            ad = cb;
            qd = $a;
            l.chartWidth = $a = W(p);
            l.chartHeight = cb = W(q);
            Ja(oa, { width: $a + Ua, height: cb + Ua });
            ga.setSize($a, cb, w);
            Da = $a - X - Ib;
            Aa = cb - ea - vb;
            Ob = null;
            u(Va, function(N) {
                N.isDirty = true;
                N.setScale();
            });
            u(Ha, function(N) { N.isDirty = true; });
            l.isDirtyLegend = true;
            l.isDirtyBox = true;
            Gc();
            x && x.align(null, null, Rb);
            V && V.align(null,
                null, Rb);
            i(w);
            ad = null;
            Pa(l, "resize");
            Bc === false ? T() : setTimeout(T, Bc && Bc.duration || 500);
        };
        zd = function() {
            l.plotLeft = X = W(X);
            l.plotTop = ea = W(ea);
            l.plotWidth = Da = W($a - X - Ib);
            l.plotHeight = Aa = W(cb - ea - vb);
            l.plotSizeX = va ? Aa : Da;
            l.plotSizeY = va ? Da : Aa;
            Rb = { x: Lb, y: Na, width: $a - Lb - Ea, height: cb - Na - gb };
        };
        yd = function() {
            ea = A(y, Na);
            Ib = A(C, Ea);
            vb = A(Z, gb);
            X = A(Sa, Lb);
            Xb = [0, 0, 0, 0];
        };
        vd = function() {
            var p = z.borderWidth || 0, q = z.backgroundColor, w = z.plotBackgroundColor, x = z.plotBackgroundImage, V, N = { x: X, y: ea, width: Da, height: Aa };
            V = p + (z.shadow ?
                8 : 0);
            if (p || q)
                if (wc) wc.animate(wc.crisp(null, null, null, $a - V, cb - V));
                else wc = ga.rect(V / 2, V / 2, $a - V, cb - V, z.borderRadius, p).attr({ stroke: z.borderColor, "stroke-width": p, fill: q || jb }).add().shadow(z.shadow);
            if (w)
                if (Kc) Kc.animate(N);
                else Kc = ga.rect(X, ea, Da, Aa, 0).attr({ fill: w }).add().shadow(z.plotShadow);
            if (x)
                if (Ad) Ad.animate(N);
                else Ad = ga.image(x, X, ea, Da, Aa).add();
            if (z.plotBorderWidth)
                if (xc) xc.animate(xc.crisp(null, X, ea, Da, Aa));
                else
                    xc = ga.rect(X, ea, Da, Aa, 0, z.plotBorderWidth).attr({
                        stroke: z.plotBorderColor,
                        "stroke-width": z.plotBorderWidth,
                        zIndex: 4
                    }).add();
            l.isDirtyBox = false;
        };
        Qa(db, "unload", H);
        z.reflow !== false && Qa(l, "load", P);
        if (M) for (Bd in M) Qa(l, Bd, M[Bd]);
        l.options = a;
        l.series = Ha;
        l.addSeries = function(p, q, w) {
            var x;
            if (p) {
                oc(w, l);
                q = A(q, true);
                Pa(l, "addSeries", { options: p }, function() {
                    x = g(p);
                    x.isDirty = true;
                    l.isDirtyLegend = true;
                    q && l.redraw();
                });
            }
            return x;
        };
        l.animation = A(z.animation, true);
        l.destroy = H;
        l.get = function(p) {
            var q, w, x;
            for (q = 0; q < Va.length; q++) if (Va[q].options.id === p) return Va[q];
            for (q = 0; q < Ha.length; q++)
                if (Ha[q].options.id ===
                    p) return Ha[q];
            for (q = 0; q < Ha.length; q++) {
                x = Ha[q].data;
                for (w = 0; w < x.length; w++) if (x[w].id === p) return x[w];
            }
            return null;
        };
        l.getSelectedPoints = function() {
            var p = [];
            u(Ha, function(q) { p = p.concat(Dd(q.data, function(w) { return w.selected; })); });
            return p;
        };
        l.getSelectedSeries = function() { return Dd(Ha, function(p) { return p.selected; }); };
        l.hideLoading = function() {
            gd(jc, { opacity: 0 }, { duration: a.loading.hideDuration, complete: function() { Ja(jc, { display: jb }); } });
            Cd = false;
        };
        l.isInsidePlot = gc;
        l.redraw = i;
        l.setSize = xd;
        l.setTitle = m;
        l.showLoading =
            function(p) {
                var q = a.loading;
                if (!jc) {
                    jc = hb(Tb, { className: "highcharts-loading" }, sa(q.style, { left: X + Ua, top: ea + Ua, width: Da + Ua, height: Aa + Ua, zIndex: 10, display: jb }), oa);
                    Zd = hb("span", null, q.labelStyle, jc);
                }
                Zd.innerHTML = p || a.lang.loading;
                if (!Cd) {
                    Ja(jc, { opacity: 0, display: "" });
                    gd(jc, { opacity: q.style.opacity }, { duration: q.showDuration });
                    Cd = true;
                }
            };
        l.pointCount = 0;
        l.counters = new Gd;
        U();
    }

    var ua = document, db = window, Fa = Math, W = Fa.round, lb = Fa.floor, md = Fa.ceil, Ia = Fa.max, tb = Fa.min, bb = Fa.abs, rb = Fa.cos, Cb = Fa.sin, kc = Fa.PI, ae =
        kc * 2 / 360, yc = navigator.userAgent, Pc = /msie/i .test(yc) && !db.opera, Mc = ua.documentMode === 8, Ud = /AppleWebKit/ .test(yc), Yd = /Firefox/ .test(yc), Lc = !!ua.createElementNS && !!ua.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect, me = Yd && parseInt(yc.split("Firefox/")[1], 10) < 4, fd, Kb = ua.documentElement.ontouchstart !== undefined, be = { }, wd = 0, ub = 1, Tc, Xa, Zc, Bc, Nc, Wa, Tb = "div", ic = "absolute", Xd = "relative", ob = "hidden", vc = "highcharts-", Ab = "visible", Ua = "px", jb = "none", Za = "M", Ka = "L", ce = "rgba(192,192,192," + (Lc ? 1.0E-6 :
            0.0020) + ")", ib = "", Bb = "hover", Qc, id, jd, kd, Cc, Rc, Sc, Jd, Kd, ld, Ld, Md, ma = db.HighchartsAdapter, Db = ma || { }, u = Db.each, Dd = Db.grep, tc = Db.map, Ca = Db.merge, Qa = Db.addEvent, pb = Db.removeEvent, Pa = Db.fireEvent, gd = Db.animate, Hc = Db.stop, wb = { };
    Zc = function(a, b, c) {

        function d(P) {
            return P.toString().replace( /^([0-9])$/ , "0$1");
        }

        if (!K(b) || isNaN(b)) return "Invalid date";
        a = A(a, "%Y-%m-%d %H:%M:%S");
        b = new Date(b * ub);
        var e, f = b[jd](), g = b[kd](), h = b[Cc](), i = b[Rc](), j = b[Sc](), m = Xa.lang, v = m.weekdays;
        b = {
            a: v[g].substr(0, 3),
            A: v[g],
            d: d(h),
            e: h,
            b: m.shortMonths[i],
            B: m.months[i],
            m: d(i + 1),
            y: j.toString().substr(2, 2),
            Y: j,
            H: d(f),
            I: d(f % 12 || 12),
            l: f % 12 || 12,
            M: d(b[id]()),
            p: f < 12 ? "AM" : "PM",
            P: f < 12 ? "am" : "pm",
            S: d(b.getSeconds())
        };
        for (e in b) a = a.replace("%" + e, b[e]);
        return c ? a.substr(0, 1).toUpperCase() + a.substr(1) : a;
    };
    Gd.prototype = { wrapColor: function(a) { if (this.color >= a) this.color = 0; }, wrapSymbol: function(a) { if (this.symbol >= a) this.symbol = 0; } };
    Nc = {
        init: function(a, b, c) {
            b = b || "";
            var d = a.shift, e = b.indexOf("C") > -1, f = e ? 7 : 3, g;
            b = b.split(" ");
            c = [].concat(c);
            var h,
                i, j = function(m) { for (g = m.length; g--;) m[g] === Za && m.splice(g + 1, 0, m[g + 1], m[g + 2], m[g + 1], m[g + 2]); };
            if (e) {
                j(b);
                j(c);
            }
            if (a.isArea) {
                h = b.splice(b.length - 6, 6);
                i = c.splice(c.length - 6, 6);
            }
            if (d) {
                c = [].concat(c).splice(0, f).concat(c);
                a.shift = false;
            }
            if (b.length)
                for (a = c.length; b.length < a;) {
                    d = [].concat(b).splice(b.length - f, f);
                    if (e) {
                        d[f - 6] = d[f - 2];
                        d[f - 5] = d[f - 1];
                    }
                    b = b.concat(d);
                }
            if (h) {
                b = b.concat(h);
                c = c.concat(i);
            }
            return [b, c];
        },
        step: function(a, b, c, d) {
            var e = [], f = a.length;
            if (c === 1) e = d;
            else if (f === b.length && c < 1)
                for (; f--;) {
                    d = parseFloat(a[f]);
                    e[f] = isNaN(d) ? a[f] : c * parseFloat(b[f] - d) + d;
                }
            else e = b;
            return e;
        }
    };
    ma && ma.init && ma.init(Nc);
    if (!ma && db.jQuery) {
        var Mb = jQuery;
        u = function(a, b) { for (var c = 0, d = a.length; c < d; c++) if (b.call(a[c], a[c], c, a) === false) return c; };
        Dd = Mb.grep;
        tc = function(a, b) {
            for (var c = [], d = 0, e = a.length; d < e; d++) c[d] = b.call(a[d], a[d], d, a);
            return c;
        };
        Ca = function() {
            var a = arguments;
            return Mb.extend(true, null, a[0], a[1], a[2], a[3]);
        };
        Qa = function(a, b, c) { Mb(a).bind(b, c); };
        pb = function(a, b, c) {
            var d = ua.removeEventListener ? "removeEventListener" : "detachEvent";
            if (ua[d] && !a[d])
                a[d] = function() {
                };
            Mb(a).unbind(b, c);
        };
        Pa = function(a, b, c, d) {
            var e = Mb.Event(b), f = "detached" + b;
            sa(e, c);
            if (a[b]) {
                a[f] = a[b];
                a[b] = null;
            }
            Mb(a).trigger(e);
            if (a[f]) {
                a[b] = a[f];
                a[f] = null;
            }
            d && !e.isDefaultPrevented() && d(e);
        };
        gd = function(a, b, c) {
            var d = Mb(a);
            if (b.d) {
                a.toD = b.d;
                b.d = 1;
            }
            d.stop();
            d.animate(b, c);
        };
        Hc = function(a) { Mb(a).stop(); };
        Mb.extend(Mb.easing, { easeOutQuad: function(a, b, c, d, e) { return -d * (b /= e) * (b - 2) + c; } });
        var de = jQuery.fx, ee = de.step;
        u(["cur", "_default", "width", "height"], function(a, b) {
            var c = b ?
                ee : de.prototype, d = c[a], e;
            if (d)
                c[a] = function(f) {
                    f = b ? f : this;
                    e = f.elem;
                    return e.attr ? e.attr(f.prop, f.now) : d.apply(this, arguments);
                };
        });
        ee.d = function(a) {
            var b = a.elem;
            if (!a.started) {
                var c = Nc.init(b, b.d, b.toD);
                a.start = c[0];
                a.end = c[1];
                a.started = true;
            }
            b.attr("d", Nc.step(a.start, a.end, a.pos, b.toD));
        };
    }
    ma = { enabled: true, align: "center", x: 0, y: 15, style: { color: "#666", fontSize: "11px", lineHeight: "14px" } };
    Xa = {
        colors: ["#4572A7", "#AA4643", "#89A54E", "#80699B", "#3D96AE", "#DB843D", "#92A8CD", "#A47D7C", "#B5CA92"],
        symbols: ["circle",
            "diamond", "square", "triangle", "triangle-down"],
        lang: { loading: "Loading...", months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "June", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], weekdays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], decimalPoint: ".", resetZoom: "Reset zoom", resetZoomTitle: "Reset zoom level 1:1", thousandsSep: "," },
        global: { useUTC: true },
        chart: {
            borderColor: "#4572A7",
            borderRadius: 5,
            defaultSeriesType: "line",
            ignoreHiddenSeries: true,
            spacingTop: 10,
            spacingRight: 10,
            spacingBottom: 15,
            spacingLeft: 10,
            style: { fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', fontSize: "12px" },
            backgroundColor: "#FFFFFF",
            plotBorderColor: "#C0C0C0"
        },
        title: { text: "Chart title", align: "center", y: 15, style: { color: "#3E576F", fontSize: "16px" } },
        subtitle: { text: "", align: "center", y: 30, style: { color: "#6D869F" } },
        plotOptions: {
            line: {
                allowPointSelect: false,
                showCheckbox: false,
                animation: { duration: 1E3 },
                events: { },
                lineWidth: 2,
                shadow: true,
                marker: { enabled: true, lineWidth: 0, radius: 4, lineColor: "#FFFFFF", states: { hover: { }, select: { fillColor: "#FFFFFF", lineColor: "#000000", lineWidth: 2 } } },
                point: { events: { } },
                dataLabels: Ca(ma, { enabled: false, y: -6, formatter: function() { return this.y; } }),
                showInLegend: true,
                states: { hover: { marker: { } }, select: { marker: { } } },
                stickyTracking: true
            }
        },
        labels: { style: { position: ic, color: "#3E576F" } },
        legend: {
            enabled: true,
            align: "center",
            layout: "horizontal",
            labelFormatter: function() { return this.name; },
            borderWidth: 1,
            borderColor: "#909090",
            borderRadius: 5,
            shadow: false,
            style: { padding: "5px" },
            itemStyle: { cursor: "pointer", color: "#3E576F" },
            itemHoverStyle: { cursor: "pointer", color: "#000000" },
            itemHiddenStyle: { color: "#C0C0C0" },
            itemCheckboxStyle: { position: ic, width: "13px", height: "13px" },
            symbolWidth: 16,
            symbolPadding: 5,
            verticalAlign: "bottom",
            x: 0,
            y: 0
        },
        loading: { hideDuration: 100, labelStyle: { fontWeight: "bold", position: Xd, top: "1em" }, showDuration: 100, style: { position: ic, backgroundColor: "white", opacity: 0.5, textAlign: "center" } },
        tooltip: { enabled: true, backgroundColor: "rgba(255, 255, 255, .85)", borderWidth: 2, borderRadius: 5, shadow: true, snap: Kb ? 25 : 10, style: { color: "#333333", fontSize: "12px", padding: "5px", whiteSpace: "nowrap" } },
        toolbar: { itemStyle: { color: "#4572A7", cursor: "pointer" } },
        credits: { enabled: true, text: "Highcharts.com", href: "http://www.highcharts.com", position: { align: "right", x: -10, verticalAlign: "bottom", y: -5 }, style: { cursor: "pointer", color: "#909090", fontSize: "10px" } }
    };
    var Yc = {
        dateTimeLabelFormats: {
            second: "%H:%M:%S",
            minute: "%H:%M",
            hour: "%H:%M",
            day: "%e. %b",
            week: "%e. %b",
            month: "%b '%y",
            year: "%Y"
        },
        endOnTick: false,
        gridLineColor: "#C0C0C0",
        labels: ma,
        lineColor: "#C0D0E0",
        lineWidth: 1,
        max: null,
        min: null,
        minPadding: 0.01,
        maxPadding: 0.01,
        minorGridLineColor: "#E0E0E0",
        minorGridLineWidth: 1,
        minorTickColor: "#A0A0A0",
        minorTickLength: 2,
        minorTickPosition: "outside",
        startOfWeek: 1,
        startOnTick: false,
        tickColor: "#C0D0E0",
        tickLength: 5,
        tickmarkPlacement: "between",
        tickPixelInterval: 100,
        tickPosition: "outside",
        tickWidth: 1,
        title: {
            align: "middle",
            style: {
                color: "#6D869F",
                fontWeight: "bold"
            }
        },
        type: "linear"
    }, od = Ca(Yc, { endOnTick: true, gridLineWidth: 1, tickPixelInterval: 72, showLastLabel: true, labels: { align: "right", x: -8, y: 3 }, lineWidth: 0, maxPadding: 0.05, minPadding: 0.05, startOnTick: true, tickWidth: 0, title: { rotation: 270, text: "Y-values" }, stackLabels: { enabled: false, formatter: function() { return this.total; }, style: ma.style } }), ie = { labels: { align: "right", x: -8, y: null }, title: { rotation: 270 } }, he = { labels: { align: "left", x: 8, y: null }, title: { rotation: 90 } }, Td = { labels: { align: "center", x: 0, y: 14 }, title: { rotation: 0 } },
        ge = Ca(Td, { labels: { y: -5 } }), xb = Xa.plotOptions;
    ma = xb.line;
    xb.spline = Ca(ma);
    xb.scatter = Ca(ma, { lineWidth: 0, states: { hover: { lineWidth: 0 } } });
    xb.area = Ca(ma, { });
    xb.areaspline = Ca(xb.area);
    xb.column = Ca(ma, { borderColor: "#FFFFFF", borderWidth: 1, borderRadius: 0, groupPadding: 0.2, marker: null, pointPadding: 0.1, minPointLength: 0, states: { hover: { brightness: 0.1, shadow: false }, select: { color: "#C0C0C0", borderColor: "#000000", shadow: false } }, dataLabels: { y: null, verticalAlign: null } });
    xb.bar = Ca(xb.column, {
        dataLabels: {
            align: "left",
            x: 5,
            y: 0
        }
    });
    xb.pie = Ca(ma, { borderColor: "#FFFFFF", borderWidth: 1, center: ["50%", "50%"], colorByPoint: true, dataLabels: { distance: 30, enabled: true, formatter: function() { return this.point.name; }, y: 5 }, legendType: "point", marker: null, size: "75%", showInLegend: false, slicedOffset: 10, states: { hover: { brightness: 0.1, shadow: false } } });
    Id();
    var bc = function(a) {
        var b = [], c;
        (function(d) {
            if (c = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/ .exec(d))
                b = [ja(c[1]), ja(c[2]), ja(c[3]), parseFloat(c[4],
                    10)];
            else if (c = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/ .exec(d)) b = [ja(c[1], 16), ja(c[2], 16), ja(c[3], 16), 1];
        })(a);
        return {
            get: function(d) { return b && !isNaN(b[0]) ? d === "rgb" ? "rgb(" + b[0] + "," + b[1] + "," + b[2] + ")" : d === "a" ? b[3] : "rgba(" + b.join(",") + ")" : a; },
            brighten: function(d) {
                if (lc(d) && d !== 0) {
                    var e;
                    for (e = 0; e < 3; e++) {
                        b[e] += ja(d * 255);
                        if (b[e] < 0) b[e] = 0;
                        if (b[e] > 255) b[e] = 255;
                    }
                }
                return this;
            },
            setOpacity: function(d) {
                b[3] = d;
                return this;
            }
        };
    };
    Uc.prototype = {
        init: function(a, b) {
            this.element = ua.createElementNS("http://www.w3.org/2000/svg",
                b);
            this.renderer = a;
        },
        animate: function(a, b, c) {
            if (b = A(b, Bc, true)) {
                b = Ca(b);
                if (c) b.complete = c;
                gd(this, a, b);
            } else {
                this.attr(a);
                c && c();
            }
        },
        attr: function(a, b) {
            var c, d, e, f, g = this.element, h = g.nodeName, i = this.renderer, j, m = this.shadows, v = this.htmlNode, P, T = this;
            if (Sb(a) && K(b)) {
                c = a;
                a = { };
                a[c] = b;
            }
            if (Sb(a)) {
                c = a;
                if (h === "circle") c = { x: "cx", y: "cy" }[c] || c;
                else if (c === "strokeWidth") c = "stroke-width";
                T = Ga(g, c) || this[c] || 0;
                if (c !== "d" && c !== "visibility") T = parseFloat(T);
            } else
                for (c in a) {
                    j = false;
                    d = a[c];
                    if (c === "d") {
                        if (d && d.join)
                            d =
                                d.join(" ");
                        if ( /(NaN| {2}|^$)/ .test(d)) d = "M 0 0";
                        this.d = d;
                    } else if (c === "x" && h === "text") {
                        for (e = 0; e < g.childNodes.length; e++) {
                            f = g.childNodes[e];
                            Ga(f, "x") === Ga(g, "x") && Ga(f, "x", d);
                        }
                        if (this.rotation) Ga(g, "transform", "rotate(" + this.rotation + " " + d + " " + ja(a.y || Ga(g, "y")) + ")");
                    } else if (c === "fill") d = i.color(d, g, c);
                    else if (h === "circle" && (c === "x" || c === "y")) c = { x: "cx", y: "cy" }[c] || c;
                    else if (c === "translateX" || c === "translateY" || c === "rotation" || c === "verticalAlign") {
                        this[c] = d;
                        this.updateTransform();
                        j = true;
                    } else if (c ===
                        "stroke") d = i.color(d, g, c);
                    else if (c === "dashstyle") {
                        c = "stroke-dasharray";
                        d = d && d.toLowerCase();
                        if (d === "solid") d = jb;
                        else if (d) {
                            d = d.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace( /dot/g , "1,3,").replace("dash", "4,3,").replace( /,$/ , "").split(",");
                            for (e = d.length; e--;) d[e] = ja(d[e]) * a["stroke-width"];
                            d = d.join(",");
                        }
                    } else if (c === "isTracker") this[c] = d;
                    else if (c === "width") d = ja(d);
                    else if (c ===
                        "align") {
                        c = "text-anchor";
                        d = { left: "start", center: "middle", right: "end" }[d];
                    } else if (c === "title") {
                        e = ua.createElementNS("http://www.w3.org/2000/svg", "title");
                        e.appendChild(ua.createTextNode(d));
                        g.appendChild(e);
                    }
                    if (c === "strokeWidth") c = "stroke-width";
                    if (Ud && c === "stroke-width" && d === 0) d = 1.0E-6;
                    if (this.symbolName && /^(x|y|r|start|end|innerR)/ .test(c)) {
                        if (!P) {
                            this.symbolAttr(a);
                            P = true;
                        }
                        j = true;
                    }
                    if (m && /^(width|height|visibility|x|y|d)$/ .test(c)) for (e = m.length; e--;) Ga(m[e], c, d);
                    if ((c === "width" || c === "height") && h ===
                        "rect" && d < 0) d = 0;
                    if (c === "text") {
                        this.textStr = d;
                        this.added && i.buildText(this);
                    } else j || Ga(g, c, d);
                    if (v && (c === "x" || c === "y" || c === "translateX" || c === "translateY" || c === "visibility")) {
                        e = v.length ? v : [this];
                        f = e.length;
                        var Y;
                        for (Y = 0; Y < f; Y++) {
                            v = e[Y];
                            j = v.getBBox();
                            v = v.htmlNode;
                            Ja(v, sa(this.styles, { left: j.x + (this.translateX || 0) + Ua, top: j.y + (this.translateY || 0) + Ua }));
                            c === "visibility" && Ja(v, { visibility: d });
                        }
                    }
                }
            return T;
        },
        symbolAttr: function(a) {
            var b = this;
            u(["x", "y", "r", "start", "end", "width", "height", "innerR"], function(c) {
                b[c] =
                    A(a[c], b[c]);
            });
            b.attr({ d: b.renderer.symbols[b.symbolName](W(b.x * 2) / 2, W(b.y * 2) / 2, b.r, { start: b.start, end: b.end, width: b.width, height: b.height, innerR: b.innerR }) });
        },
        clip: function(a) { return this.attr("clip-path", "url(" + this.renderer.url + "#" + a.id + ")"); },
        crisp: function(a, b, c, d, e) {
            var f, g = { }, h = { }, i;
            a = a || this.strokeWidth || 0;
            i = a % 2 / 2;
            h.x = lb(b || this.x || 0) + i;
            h.y = lb(c || this.y || 0) + i;
            h.width = lb((d || this.width || 0) - 2 * i);
            h.height = lb((e || this.height || 0) - 2 * i);
            h.strokeWidth = a;
            for (f in h) if (this[f] !== h[f]) this[f] = g[f] = h[f];
            return g;
        },
        css: function(a) {
            var b = this.element;
            b = a && a.width && b.nodeName === "text";
            var c, d = "", e = function(f, g) { return "-" + g.toLowerCase(); };
            if (a && a.color) a.fill = a.color;
            this.styles = a = sa(this.styles, a);
            if (Pc && !Lc) {
                b && delete a.width;
                Ja(this.element, a);
            } else {
                for (c in a) d += c.replace( /([A-Z])/g , e) + ":" + a[c] + ";";
                this.attr({ style: d });
            }
            b && this.added && this.renderer.buildText(this);
            return this;
        },
        on: function(a, b) {
            var c = b;
            if (Kb && a === "click") {
                a = "touchstart";
                c = function(d) {
                    d.preventDefault();
                    b();
                };
            }
            this.element["on" + a] = c;
            return this;
        },
        translate: function(a, b) { return this.attr({ translateX: a, translateY: b }); },
        invert: function() {
            this.inverted = true;
            this.updateTransform();
            return this;
        },
        updateTransform: function() {
            var a = this.translateX || 0, b = this.translateY || 0, c = this.inverted, d = this.rotation, e = [];
            if (c) {
                a += this.attr("width");
                b += this.attr("height");
            }
            if (a || b) e.push("translate(" + a + "," + b + ")");
            if (c) e.push("rotate(90) scale(-1,1)");
            else d && e.push("rotate(" + d + " " + this.x + " " + this.y + ")");
            e.length && Ga(this.element, "transform", e.join(" "));
        },
        toFront: function() {
            var a =
                this.element;
            a.parentNode.appendChild(a);
            return this;
        },
        align: function(a, b, c) {
            if (a) {
                this.alignOptions = a;
                this.alignByTranslate = b;
                c || this.renderer.alignedObjects.push(this);
            } else {
                a = this.alignOptions;
                b = this.alignByTranslate;
            }
            c = A(c, this.renderer);
            var d = a.align, e = a.verticalAlign, f = (c.x || 0) + (a.x || 0), g = (c.y || 0) + (a.y || 0), h = { };
            if ( /^(right|center)$/ .test(d)) f += (c.width - (a.width || 0)) / { right: 1, center: 2 }[d];
            h[b ? "translateX" : "x"] = W(f);
            if ( /^(bottom|middle)$/ .test(e))
                g += (c.height - (a.height || 0)) / ({ bottom: 1, middle: 2 }[e] ||
                    1);
            h[b ? "translateY" : "y"] = W(g);
            this[this.placed ? "animate" : "attr"](h);
            this.placed = true;
            this.alignAttr = h;
            return this;
        },
        getBBox: function() {
            var a, b, c, d = this.rotation, e = d * ae;
            try {
                a = sa({ }, this.element.getBBox());
            } catch(f) {
                a = { width: 0, height: 0 };
            }
            b = a.width;
            c = a.height;
            if (d) {
                a.width = bb(c * Cb(e)) + bb(b * rb(e));
                a.height = bb(c * rb(e)) + bb(b * Cb(e));
            }
            return a;
        },
        show: function() { return this.attr({ visibility: Ab }); },
        hide: function() { return this.attr({ visibility: ob }); },
        add: function(a) {
            var b = this.renderer, c = a || b, d = c.element || b.box, e =
                d.childNodes, f = this.element, g = Ga(f, "zIndex");
            this.parentInverted = a && a.inverted;
            this.textStr !== undefined && b.buildText(this);
            if (a && this.htmlNode) {
                if (!a.htmlNode) a.htmlNode = [];
                a.htmlNode.push(this);
            }
            if (g) {
                c.handleZ = true;
                g = ja(g);
            }
            if (c.handleZ)
                for (c = 0; c < e.length; c++) {
                    a = e[c];
                    b = Ga(a, "zIndex");
                    if (a !== f && (ja(b) > g || !K(g) && K(b))) {
                        d.insertBefore(f, a);
                        return this;
                    }
                }
            d.appendChild(f);
            this.added = true;
            return this;
        },
        safeRemoveChild: function(a) {
            var b = a.parentNode;
            b && b.removeChild(a);
        },
        destroy: function() {
            var a = this, b = a.element ||
                { }, c = a.shadows, d, e;
            b.onclick = b.onmouseout = b.onmouseover = b.onmousemove = null;
            Hc(a);
            if (a.clipPath) a.clipPath = a.clipPath.destroy();
            if (a.stops) {
                for (e = 0; e < a.stops.length; e++) a.stops[e] = a.stops[e].destroy();
                a.stops = null;
            }
            a.safeRemoveChild(b);
            c && u(c, function(f) { a.safeRemoveChild(f); });
            nc(a.renderer.alignedObjects, a);
            for (d in a) delete a[d];
            return null;
        },
        empty: function() { for (var a = this.element, b = a.childNodes, c = b.length; c--;) a.removeChild(b[c]); },
        shadow: function(a, b) {
            var c = [], d, e, f = this.element, g = this.parentInverted ?
                "(-1,-1)" : "(1,1)";
            if (a) {
                for (d = 1; d <= 3; d++) {
                    e = f.cloneNode(0);
                    Ga(e, { isShadow: "true", stroke: "rgb(0, 0, 0)", "stroke-opacity": 0.05 * d, "stroke-width": 7 - 2 * d, transform: "translate" + g, fill: jb });
                    b ? b.element.appendChild(e) : f.parentNode.insertBefore(e, f);
                    c.push(e);
                }
                this.shadows = c;
            }
            return this;
        }
    };
    var ed = function() { this.init.apply(this, arguments); };
    ed.prototype = {
        Element: Uc,
        init: function(a, b, c, d) {
            var e = location, f;
            f = this.createElement("svg").attr({ xmlns: "http://www.w3.org/2000/svg", version: "1.1" });
            a.appendChild(f.element);
            this.box = f.element;
            this.boxWrapper = f;
            this.alignedObjects = [];
            this.url = Pc ? "" : e.href.replace( /#.*?$/ , "");
            this.defs = this.createElement("defs").add();
            this.forExport = d;
            this.gradients = [];
            this.setSize(b, c, false);
        },
        destroy: function() {
            var a, b = this.gradients, c = this.defs;
            this.box = null;
            this.boxWrapper = this.boxWrapper.destroy();
            if (b) {
                for (a = 0; a < b.length; a++) this.gradients[a] = b[a].destroy();
                this.gradients = null;
            }
            if (c) this.defs = c.destroy();
            return this.alignedObjects = null;
        },
        createElement: function(a) {
            var b = new this.Element;
            b.init(this, a);
            return b;
        },
        buildText: function(a) {
            for (var b = a.element, c = A(a.textStr, "").toString().replace( /<(b|strong)>/g , '<span style="font-weight:bold">').replace( /<(i|em)>/g , '<span style="font-style:italic">').replace( /<a/g , "<span").replace( /<\/(b|strong|i|em|a)>/g , "</span>").split( /<br.*?>/g ), d = b.childNodes, e = /style="([^"]+)"/ , f = /href="([^"]+)"/ , g = Ga(b, "x"), h = a.styles, i = h && a.useHTML && !this.forExport, j = a.htmlNode, m = h && ja(h.width), v = h && h.lineHeight, P, T = d.length; T--;) b.removeChild(d[T]);
            m && !a.added &&
                this.box.appendChild(b);
            u(c, function(Y, H) {
                var U, z = 0, M;
                Y = Y.replace( /<span/g , "|||<span").replace( /<\/span>/g , "</span>|||");
                U = Y.split("|||");
                u(U, function(y) {
                    if (y !== "" || U.length === 1) {
                        var C = { }, Z = ua.createElementNS("http://www.w3.org/2000/svg", "tspan");
                        e.test(y) && Ga(Z, "style", y.match(e)[1].replace( /(;| |^)color([ :])/ , "$1fill$2"));
                        if (f.test(y)) {
                            Ga(Z, "onclick", 'location.href="' + y.match(f)[1] + '"');
                            Ja(Z, { cursor: "pointer" });
                        }
                        y = (y.replace( /<(.|\n)*?>/g , "") || " ").replace( /&lt;/g , "<").replace( /&gt;/g , ">");
                        Z.appendChild(ua.createTextNode(y));
                        if (z) C.dx = 3;
                        else C.x = g;
                        if (!z) {
                            if (H) {
                                !Lc && a.renderer.forExport && Ja(Z, { display: "block" });
                                M = db.getComputedStyle && ja(db.getComputedStyle(P, null).getPropertyValue("line-height"));
                                if (!M || isNaN(M)) M = v || P.offsetHeight || 18;
                                Ga(Z, "dy", M);
                            }
                            P = Z;
                        }
                        Ga(Z, C);
                        b.appendChild(Z);
                        z++;
                        if (m) {
                            y = y.replace( /-/g , "- ").split(" ");
                            for (var Sa, Na = []; y.length || Na.length;) {
                                Sa = b.getBBox().width;
                                C = Sa > m;
                                if (!C || y.length === 1) {
                                    y = Na;
                                    Na = [];
                                    if (y.length) {
                                        Z = ua.createElementNS("http://www.w3.org/2000/svg", "tspan");
                                        Ga(Z, { dy: v || 16, x: g });
                                        b.appendChild(Z);
                                        if (Sa > m) m = Sa;
                                    }
                                } else {
                                    Z.removeChild(Z.firstChild);
                                    Na.unshift(y.pop());
                                }
                                y.length && Z.appendChild(ua.createTextNode(y.join(" ").replace( /- /g , "-")));
                            }
                        }
                    }
                });
            });
            if (i) {
                if (!j) j = a.htmlNode = hb("span", null, sa(h, { position: ic, top: 0, left: 0 }), this.box.parentNode);
                j.innerHTML = a.textStr;
                for (T = d.length; T--;) d[T].style.visibility = ob;
            }
        },
        crispLine: function(a, b) {
            if (a[1] === a[4]) a[1] = a[4] = W(a[1]) + b % 2 / 2;
            if (a[2] === a[5]) a[2] = a[5] = W(a[2]) + b % 2 / 2;
            return a;
        },
        path: function(a) { return this.createElement("path").attr({ d: a, fill: jb }); },
        circle: function(a,
            b, c) {
            a = Nb(a) ? a : { x: a, y: b, r: c };
            return this.createElement("circle").attr(a);
        },
        arc: function(a, b, c, d, e, f) {
            if (Nb(a)) {
                b = a.y;
                c = a.r;
                d = a.innerR;
                e = a.start;
                f = a.end;
                a = a.x;
            }
            return this.symbol("arc", a || 0, b || 0, c || 0, { innerR: d || 0, start: e || 0, end: f || 0 });
        },
        rect: function(a, b, c, d, e, f) {
            if (Nb(a)) {
                b = a.y;
                c = a.width;
                d = a.height;
                e = a.r;
                f = a.strokeWidth;
                a = a.x;
            }
            e = this.createElement("rect").attr({ rx: e, ry: e, fill: jb });
            return e.attr(e.crisp(f, a, b, Ia(c, 0), Ia(d, 0)));
        },
        setSize: function(a, b, c) {
            var d = this.alignedObjects, e = d.length;
            this.width = a;
            this.height = b;
            for (this.boxWrapper[A(c, true) ? "animate" : "attr"]({ width: a, height: b }); e--;) d[e].align();
        },
        g: function(a) {
            var b = this.createElement("g");
            return K(a) ? b.attr({ "class": vc + a }) : b;
        },
        image: function(a, b, c, d, e) {
            var f = { preserveAspectRatio: jb };
            arguments.length > 1 && sa(f, { x: b, y: c, width: d, height: e });
            f = this.createElement("image").attr(f);
            f.element.setAttributeNS ? f.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", a) : f.element.setAttribute("hc-svg-href", a);
            return f;
        },
        symbol: function(a, b, c, d, e) {
            var f,
                g = this.symbols[a];
            g = g && g(W(b), W(c), d, e);
            var h = /^url\((.*?)\)$/ , i;
            if (g) {
                f = this.path(g);
                sa(f, { symbolName: a, x: b, y: c, r: d });
                e && sa(f, e);
            } else if (h.test(a)) {
                var j = function(m, v) { m.attr({ width: v[0], height: v[1] }).translate(-W(v[0] / 2), -W(v[1] / 2)); };
                i = a.match(h)[1];
                a = be[i];
                f = this.image(i).attr({ x: b, y: c });
                if (a) j(f, a);
                else {
                    f.attr({ width: 0, height: 0 });
                    hb("img", { onload: function() { j(f, be[i] = [this.width, this.height]); }, src: i });
                }
            } else f = this.circle(b, c, d);
            return f;
        },
        symbols: {
            square: function(a, b, c) {
                c = 0.707 * c;
                return [Za, a - c,
                    b - c, Ka, a + c, b - c, a + c, b + c, a - c, b + c, "Z"];
            },
            triangle: function(a, b, c) { return [Za, a, b - 1.33 * c, Ka, a + c, b + 0.67 * c, a - c, b + 0.67 * c, "Z"]; },
            "triangle-down": function(a, b, c) { return [Za, a, b + 1.33 * c, Ka, a - c, b - 0.67 * c, a + c, b - 0.67 * c, "Z"]; },
            diamond: function(a, b, c) { return [Za, a, b - c, Ka, a + c, b, a, b + c, a - c, b, "Z"]; },
            arc: function(a, b, c, d) {
                var e = d.start, f = d.end - 1.0E-6, g = d.innerR, h = rb(e), i = Cb(e), j = rb(f);
                f = Cb(f);
                d = d.end - e < kc ? 0 : 1;
                return [Za, a + c * h, b + c * i, "A", c, c, 0, d, 1, a + c * j, b + c * f, Ka, a + g * j, b + g * f, "A", g, g, 0, d, 0, a + g * h, b + g * i, "Z"];
            }
        },
        clipRect: function(a, b,
            c, d) {
            var e = vc + wd++, f = this.createElement("clipPath").attr({ id: e }).add(this.defs);
            a = this.rect(a, b, c, d, 0).add(f);
            a.id = e;
            a.clipPath = f;
            return a;
        },
        color: function(a, b, c) {
            var d, e = /^rgba/ ;
            if (a && a.linearGradient) {
                var f = this;
                b = a.linearGradient;
                c = vc + wd++;
                var g, h, i;
                g = f.createElement("linearGradient").attr({ id: c, gradientUnits: "userSpaceOnUse", x1: b[0], y1: b[1], x2: b[2], y2: b[3] }).add(f.defs);
                f.gradients.push(g);
                g.stops = [];
                u(a.stops, function(j) {
                    if (e.test(j[1])) {
                        d = bc(j[1]);
                        h = d.get("rgb");
                        i = d.get("a");
                    } else {
                        h = j[1];
                        i = 1;
                    }
                    j =
                        f.createElement("stop").attr({ offset: j[0], "stop-color": h, "stop-opacity": i }).add(g);
                    g.stops.push(j);
                });
                return "url(" + this.url + "#" + c + ")";
            } else if (e.test(a)) {
                d = bc(a);
                Ga(b, c + "-opacity", d.get("a"));
                return d.get("rgb");
            } else {
                b.removeAttribute(c + "-opacity");
                return a;
            }
        },
        text: function(a, b, c, d) {
            var e = Xa.chart.style;
            b = W(A(b, 0));
            c = W(A(c, 0));
            a = this.createElement("text").attr({ x: b, y: c, text: a }).css({ fontFamily: e.fontFamily, fontSize: e.fontSize });
            a.x = b;
            a.y = c;
            a.useHTML = d;
            return a;
        }
    };
    fd = ed;
    if (!Lc) {
        Db = yb(Uc, {
            init: function(a,
                b) {
                var c = ["<", b, ' filled="f" stroked="f"'], d = ["position: ", ic, ";"];
                if (b === "shape" || b === Tb) d.push("left:0;top:0;width:10px;height:10px;");
                if (Mc) d.push("visibility: ", b === Tb ? ob : Ab);
                c.push(' style="', d.join(""), '"/>');
                if (b) {
                    c = b === Tb || b === "span" || b === "img" ? c.join("") : a.prepVML(c);
                    this.element = hb(c);
                }
                this.renderer = a;
            },
            add: function(a) {
                var b = this.renderer, c = this.element, d = b.box;
                d = a ? a.element || a : d;
                a && a.inverted && b.invertChild(c, d);
                Mc && d.gVis === ob && Ja(c, { visibility: ob });
                d.appendChild(c);
                this.added = true;
                this.alignOnAdd &&
                    this.updateTransform();
                return this;
            },
            attr: function(a, b) {
                var c, d, e, f = this.element || { }, g = f.style, h = f.nodeName, i = this.renderer, j = this.symbolName, m, v, P = this.shadows, T = this;
                if (Sb(a) && K(b)) {
                    c = a;
                    a = { };
                    a[c] = b;
                }
                if (Sb(a)) {
                    c = a;
                    T = c === "strokeWidth" || c === "stroke-width" ? this.strokeweight : this[c];
                } else
                    for (c in a) {
                        d = a[c];
                        m = false;
                        if (j && /^(x|y|r|start|end|width|height|innerR)/ .test(c)) {
                            if (!v) {
                                this.symbolAttr(a);
                                v = true;
                            }
                            m = true;
                        } else if (c === "d") {
                            d = d || [];
                            this.d = d.join(" ");
                            e = d.length;
                            for (m = []; e--;)
                                m[e] = lc(d[e]) ? W(d[e] * 10) -
                                    5 : d[e] === "Z" ? "x" : d[e];
                            d = m.join(" ") || "x";
                            f.path = d;
                            if (P) for (e = P.length; e--;) P[e].path = d;
                            m = true;
                        } else if (c === "zIndex" || c === "visibility") {
                            if (Mc && c === "visibility" && h === "DIV") {
                                f.gVis = d;
                                m = f.childNodes;
                                for (e = m.length; e--;) Ja(m[e], { visibility: d });
                                if (d === Ab) d = null;
                            }
                            if (d) g[c] = d;
                            m = true;
                        } else if ( /^(width|height)$/ .test(c)) {
                            this[c] = d;
                            if (this.updateClipping) {
                                this[c] = d;
                                this.updateClipping();
                            } else g[c] = d;
                            m = true;
                        } else if ( /^(x|y)$/ .test(c)) {
                            this[c] = d;
                            if (f.tagName === "SPAN") this.updateTransform();
                            else
                                g[{ x: "left", y: "top" }[c]] =
                                    d;
                        } else if (c === "class") f.className = d;
                        else if (c === "stroke") {
                            d = i.color(d, f, c);
                            c = "strokecolor";
                        } else if (c === "stroke-width" || c === "strokeWidth") {
                            f.stroked = d ? true : false;
                            c = "strokeweight";
                            this[c] = d;
                            if (lc(d)) d += Ua;
                        } else if (c === "dashstyle") {
                            (f.getElementsByTagName("stroke")[0] || hb(i.prepVML(["<stroke/>"]), null, null, f))[c] = d || "solid";
                            this.dashstyle = d;
                            m = true;
                        } else if (c === "fill")
                            if (h === "SPAN") g.color = d;
                            else {
                                f.filled = d !== jb ? true : false;
                                d = i.color(d, f, c);
                                c = "fillcolor";
                            }
                        else if (c === "translateX" || c === "translateY" || c === "rotation" ||
                            c === "align") {
                            if (c === "align") c = "textAlign";
                            this[c] = d;
                            this.updateTransform();
                            m = true;
                        } else if (c === "text") {
                            this.bBox = null;
                            f.innerHTML = d;
                            m = true;
                        }
                        if (P && c === "visibility") for (e = P.length; e--;) P[e].style[c] = d;
                        if (!m)
                            if (Mc) f[c] = d;
                            else Ga(f, c, d);
                    }
                return T;
            },
            clip: function(a) {
                var b = this, c = a.members;
                c.push(b);
                b.destroyClip = function() { nc(c, b); };
                return b.css(a.getCSS(b.inverted));
            },
            css: function(a) {
                var b = this.element;
                if (b = a && b.tagName === "SPAN" && a.width) {
                    delete a.width;
                    this.textWidth = b;
                    this.updateTransform();
                }
                this.styles = sa(this.styles,
                    a);
                Ja(this.element, a);
                return this;
            },
            safeRemoveChild: function(a) { a.parentNode && pc(a); },
            destroy: function() {
                this.destroyClip && this.destroyClip();
                return Uc.prototype.destroy.apply(this);
            },
            empty: function() {
                for (var a = this.element.childNodes, b = a.length, c; b--;) {
                    c = a[b];
                    c.parentNode.removeChild(c);
                }
            },
            getBBox: function() {
                var a = this.element, b = this.bBox;
                if (!b) {
                    if (a.nodeName === "text") a.style.position = ic;
                    b = this.bBox = { x: a.offsetLeft, y: a.offsetTop, width: a.offsetWidth, height: a.offsetHeight };
                }
                return b;
            },
            on: function(a, b) {
                this.element["on" +
                    a] = function() {
                        var c = db.event;
                        c.target = c.srcElement;
                        b(c);
                    };
                return this;
            },
            updateTransform: function() {
                if (this.added) {
                    var a = this, b = a.element, c = a.translateX || 0, d = a.translateY || 0, e = a.x || 0, f = a.y || 0, g = a.textAlign || "left", h = { left: 0, center: 0.5, right: 1 }[g], i = g && g !== "left";
                    if (c || d) a.css({ marginLeft: c, marginTop: d });
                    a.inverted && u(b.childNodes, function(z) { a.renderer.invertChild(z, b); });
                    if (b.tagName === "SPAN") {
                        var j, m;
                        c = a.rotation;
                        var v;
                        j = 0;
                        d = 1;
                        var P = 0, T;
                        v = ja(a.textWidth);
                        var Y = a.xCorr || 0, H = a.yCorr || 0, U = [c, g, b.innerHTML,
                            a.textWidth].join(",");
                        if (U !== a.cTT) {
                            if (K(c)) {
                                j = c * ae;
                                d = rb(j);
                                P = Cb(j);
                                Ja(b, { filter: c ? ["progid:DXImageTransform.Microsoft.Matrix(M11=", d, ", M12=", -P, ", M21=", P, ", M22=", d, ", sizingMethod='auto expand')"].join("") : jb });
                            }
                            j = b.offsetWidth;
                            m = b.offsetHeight;
                            if (j > v) {
                                Ja(b, { width: v + Ua, display: "block", whiteSpace: "normal" });
                                j = v;
                            }
                            v = W((ja(b.style.fontSize) || 12) * 1.2);
                            Y = d < 0 && -j;
                            H = P < 0 && -m;
                            T = d * P < 0;
                            Y += P * v * (T ? 1 - h : h);
                            H -= d * v * (c ? T ? h : 1 - h : 1);
                            if (i) {
                                Y -= j * h * (d < 0 ? -1 : 1);
                                if (c) H -= m * h * (P < 0 ? -1 : 1);
                                Ja(b, { textAlign: g });
                            }
                            a.xCorr = Y;
                            a.yCorr =
                                H;
                        }
                        Ja(b, { left: e + Y, top: f + H });
                        a.cTT = U;
                    }
                } else this.alignOnAdd = true;
            },
            shadow: function(a, b) {
                var c = [], d, e = this.element, f = this.renderer, g, h = e.style, i, j = e.path;
                if (j && typeof j.value !== "string") j = "x";
                if (a) {
                    for (d = 1; d <= 3; d++) {
                        i = ['<shape isShadow="true" strokeweight="', 7 - 2 * d, '" filled="false" path="', j, '" coordsize="100,100" style="', e.style.cssText, '" />'];
                        g = hb(f.prepVML(i), null, { left: ja(h.left) + 1, top: ja(h.top) + 1 });
                        i = ['<stroke color="black" opacity="', 0.05 * d, '"/>'];
                        hb(f.prepVML(i), null, null, g);
                        b ? b.element.appendChild(g) :
                            e.parentNode.insertBefore(g, e);
                        c.push(g);
                    }
                    this.shadows = c;
                }
                return this;
            }
        });
        ma = function() { this.init.apply(this, arguments); };
        ma.prototype = Ca(ed.prototype, {
            Element: Db,
            isIE8: yc.indexOf("MSIE 8.0") > -1,
            init: function(a, b, c) {
                var d;
                this.alignedObjects = [];
                d = this.createElement(Tb);
                a.appendChild(d.element);
                this.box = d.element;
                this.boxWrapper = d;
                this.setSize(b, c, false);
                if (!ua.namespaces.hcv) {
                    ua.namespaces.add("hcv", "urn:schemas-microsoft-com:vml");
                    ua.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } ";
                }
            },
            clipRect: function(a, b, c, d) {
                var e = this.createElement();
                return sa(e, {
                    members: [],
                    left: a,
                    top: b,
                    width: c,
                    height: d,
                    getCSS: function(f) {
                        var g = this.top, h = this.left, i = h + this.width, j = g + this.height;
                        g = { clip: "rect(" + W(f ? h : g) + "px," + W(f ? j : i) + "px," + W(f ? i : j) + "px," + W(f ? g : h) + "px)" };
                        !f && Mc && sa(g, { width: i + Ua, height: j + Ua });
                        return g;
                    },
                    updateClipping: function() { u(e.members, function(f) { f.css(e.getCSS(f.inverted)); }); }
                });
            },
            color: function(a, b, c) {
                var d, e = /^rgba/ ;
                if (a && a.linearGradient) {
                    var f, g, h = a.linearGradient, i, j, m, v;
                    u(a.stops,
                        function(P, T) {
                            if (e.test(P[1])) {
                                d = bc(P[1]);
                                f = d.get("rgb");
                                g = d.get("a");
                            } else {
                                f = P[1];
                                g = 1;
                            }
                            if (T) {
                                m = f;
                                v = g;
                            } else {
                                i = f;
                                j = g;
                            }
                        });
                    a = 90 - Fa.atan((h[3] - h[1]) / (h[2] - h[0])) * 180 / kc;
                    a = ["<", c, ' colors="0% ', i, ",100% ", m, '" angle="', a, '" opacity="', v, '" o:opacity2="', j, '" type="gradient" focus="100%" />'];
                    hb(this.prepVML(a), null, null, b);
                } else if (e.test(a) && b.tagName !== "IMG") {
                    d = bc(a);
                    a = ["<", c, ' opacity="', d.get("a"), '"/>'];
                    hb(this.prepVML(a), null, null, b);
                    return d.get("rgb");
                } else {
                    b = b.getElementsByTagName(c);
                    if (b.length)
                        b[0].opacity =
                            1;
                    return a;
                }
            },
            prepVML: function(a) {
                var b = this.isIE8;
                a = a.join("");
                if (b) {
                    a = a.replace("/>", ' xmlns="urn:schemas-microsoft-com:vml" />');
                    a = a.indexOf('style="') === -1 ? a.replace("/>", ' style="display:inline-block;behavior:url(#default#VML);" />') : a.replace('style="', 'style="display:inline-block;behavior:url(#default#VML);');
                } else a = a.replace("<", "<hcv:");
                return a;
            },
            text: function(a, b, c) {
                var d = Xa.chart.style;
                return this.createElement("span").attr({ text: a, x: W(b), y: W(c) }).css({
                    whiteSpace: "nowrap",
                    fontFamily: d.fontFamily,
                    fontSize: d.fontSize
                });
            },
            path: function(a) { return this.createElement("shape").attr({ coordsize: "100 100", d: a }); },
            circle: function(a, b, c) { return this.symbol("circle").attr({ x: a, y: b, r: c }); },
            g: function(a) {
                var b;
                if (a) b = { className: vc + a, "class": vc + a };
                return this.createElement(Tb).attr(b);
            },
            image: function(a, b, c, d, e) {
                var f = this.createElement("img").attr({ src: a });
                arguments.length > 1 && f.css({ left: b, top: c, width: d, height: e });
                return f;
            },
            rect: function(a, b, c, d, e, f) {
                if (Nb(a)) {
                    b = a.y;
                    c = a.width;
                    d = a.height;
                    e = a.r;
                    f = a.strokeWidth;
                    a = a.x;
                }
                var g = this.symbol("rect");
                g.r = e;
                return g.attr(g.crisp(f, a, b, Ia(c, 0), Ia(d, 0)));
            },
            invertChild: function(a, b) {
                var c = b.style;
                Ja(a, { flip: "x", left: ja(c.width) - 10, top: ja(c.height) - 10, rotation: -90 });
            },
            symbols: {
                arc: function(a, b, c, d) {
                    var e = d.start, f = d.end, g = rb(e), h = Cb(e), i = rb(f), j = Cb(f);
                    d = d.innerR;
                    var m = 0.07 / c, v = d && 0.1 / d || 0;
                    if (f - e === 0) return ["x"];
                    else if (2 * kc - f + e < m) i = -m;
                    else if (f - e < v) i = rb(e + v);
                    return ["wa", a - c, b - c, a + c, b + c, a + c * g, b + c * h, a + c * i, b + c * j, "at", a - d, b - d, a + d, b + d, a + d * i, b + d * j, a + d * g, b + d * h, "x", "e"];
                },
                circle: function(a,
                    b, c) {
                    return ["wa", a - c, b - c, a + c, b + c, a + c, b, a + c, b, "e"];
                },
                rect: function(a, b, c, d) {
                    if (!K(d)) return [];
                    var e = d.width;
                    d = d.height;
                    var f = a + e, g = b + d;
                    c = tb(c, e, d);
                    return [Za, a + c, b, Ka, f - c, b, "wa", f - 2 * c, b, f, b + 2 * c, f - c, b, f, b + c, Ka, f, g - c, "wa", f - 2 * c, g - 2 * c, f, g, f, g - c, f - c, g, Ka, a + c, g, "wa", a, g - 2 * c, a + 2 * c, g, a + c, g, a, g - c, Ka, a, b + c, "wa", a, b, a + 2 * c, b + 2 * c, a, b + c, a + c, b, "x", "e"];
                }
            }
        });
        fd = ma;
    }
    Nd.prototype.callbacks = [];
    var Oc = function() {
    };
    Oc.prototype = {
        init: function(a, b) {
            var c = a.chart.counters, d;
            this.series = a;
            this.applyOptions(b);
            this.pointAttr =
                { };
            if (a.options.colorByPoint) {
                d = a.chart.options.colors;
                if (!this.options) this.options = { };
                this.color = this.options.color = this.color || d[c.color++];
                c.wrapColor(d.length);
            }
            a.chart.pointCount++;
            return this;
        },
        applyOptions: function(a) {
            var b = this.series;
            this.config = a;
            if (lc(a) || a === null) this.y = a;
            else if (Nb(a) && !lc(a.length)) {
                sa(this, a);
                this.options = a;
            } else if (Sb(a[0])) {
                this.name = a[0];
                this.y = a[1];
            } else if (lc(a[0])) {
                this.x = a[0];
                this.y = a[1];
            }
            if (this.x === Wa) this.x = b.autoIncrement();
        },
        destroy: function() {
            var a = this, b = a.series,
                c = b.chart.hoverPoints, d;
            b.chart.pointCount--;
            if (c) {
                a.setState();
                nc(c, a);
            }
            a === b.chart.hoverPoint && a.onMouseOut();
            pb(a);
            u(["graphic", "tracker", "group", "dataLabel", "connector", "shadowGroup"], function(e) { a[e] && a[e].destroy(); });
            a.legendItem && a.series.chart.legend.destroyItem(a);
            for (d in a) a[d] = null;
        },
        getLabelConfig: function() { return { x: this.category, y: this.y, series: this.series, point: this, percentage: this.percentage, total: this.total || this.stackTotal }; },
        select: function(a, b) {
            var c = this, d = c.series.chart;
            a = A(a,
                !c.selected);
            c.firePointEvent(a ? "select" : "unselect", { accumulate: b }, function() {
                c.selected = a;
                c.setState(a && "select");
                b || u(d.getSelectedPoints(), function(e) {
                    if (e.selected && e !== c) {
                        e.selected = false;
                        e.setState(ib);
                        e.firePointEvent("unselect");
                    }
                });
            });
        },
        onMouseOver: function() {
            var a = this.series.chart, b = a.tooltip, c = a.hoverPoint;
            c && c !== this && c.onMouseOut();
            this.firePointEvent("mouseOver");
            b && !b.shared && b.refresh(this);
            this.setState(Bb);
            a.hoverPoint = this;
        },
        onMouseOut: function() {
            this.firePointEvent("mouseOut");
            this.setState();
            this.series.chart.hoverPoint = null;
        },
        tooltipFormatter: function(a) {
            var b = this.series;
            return ['<span style="color:' + b.color + '">', this.name || b.name, "</span>: ", !a ? "<b>x = " + (this.name || this.x) + ",</b> " : "", "<b>", !a ? "y = " : "", this.y, "</b>"].join("");
        },
        update: function(a, b, c) {
            var d = this, e = d.series, f = d.graphic, g = e.chart;
            b = A(b, true);
            d.firePointEvent("update", { options: a }, function() {
                d.applyOptions(a);
                if (Nb(a)) {
                    e.getAttribs();
                    f && f.attr(d.pointAttr[e.state]);
                }
                e.isDirty = true;
                b && g.redraw(c);
            });
        },
        remove: function(a, b) {
            var c =
                    this, d = c.series, e = d.chart, f = d.data;
            oc(b, e);
            a = A(a, true);
            c.firePointEvent("remove", null, function() {
                nc(f, c);
                c.destroy();
                d.isDirty = true;
                a && e.redraw();
            });
        },
        firePointEvent: function(a, b, c) {
            var d = this, e = this.series.options;
            if (e.point.events[a] || d.options && d.options.events && d.options.events[a]) this.importEvents();
            if (a === "click" && e.allowPointSelect) c = function(f) { d.select(null, f.ctrlKey || f.metaKey || f.shiftKey); };
            Pa(this, a, b, c);
        },
        importEvents: function() {
            if (!this.hasImportedEvents) {
                var a = Ca(this.series.options.point,
                    this.options).events, b;
                this.events = a;
                for (b in a) Qa(this, b, a[b]);
                this.hasImportedEvents = true;
            }
        },
        setState: function(a) {
            var b = this.series, c = b.options.states, d = xb[b.type].marker && b.options.marker, e = d && !d.enabled, f = (d = d && d.states[a]) && d.enabled === false, g = b.stateMarkerGraphic, h = b.chart, i = this.pointAttr;
            a = a || ib;
            if (!(a === this.state || this.selected && a !== "select" || c[a] && c[a].enabled === false || a && (f || e && !d.enabled))) {
                if (this.graphic) this.graphic.attr(i[a]);
                else {
                    if (a) {
                        if (!g)
                            b.stateMarkerGraphic = g = h.renderer.circle(0,
                                0, i[a].r).attr(i[a]).add(b.group);
                        g.translate(this.plotX, this.plotY);
                    }
                    if (g) g[a ? "show" : "hide"]();
                }
                this.state = a;
            }
        }
    };
    var sb = function() {
    };
    sb.prototype = {
        isCartesian: true,
        type: "line",
        pointClass: Oc,
        pointAttrToOptions: { stroke: "lineColor", "stroke-width": "lineWidth", fill: "fillColor", r: "radius" },
        init: function(a, b) {
            var c, d;
            d = a.series.length;
            this.chart = a;
            b = this.setOptions(b);
            sa(this, { index: d, options: b, name: b.name || "Series " + (d + 1), state: ib, pointAttr: { }, visible: b.visible !== false, selected: b.selected === true });
            d = b.events;
            for (c in d) Qa(this, c, d[c]);
            if (d && d.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = true;
            this.getColor();
            this.getSymbol();
            this.setData(b.data, false);
        },
        autoIncrement: function() {
            var a = this.options, b = this.xIncrement;
            b = A(b, a.pointStart, 0);
            this.pointInterval = A(this.pointInterval, a.pointInterval, 1);
            this.xIncrement = b + this.pointInterval;
            return b;
        },
        cleanData: function() {
            var a = this.chart, b = this.data, c, d, e = a.smallestInterval, f, g;
            Hd(b, function(h, i) { return h.x - i.x; });
            if (this.options.connectNulls)
                for (g =
                    b.length - 1; g >= 0; g--) b[g].y === null && b[g - 1] && b[g + 1] && b.splice(g, 1);
            for (g = b.length - 1; g >= 0; g--)
                if (b[g - 1]) {
                    f = b[g].x - b[g - 1].x;
                    if (f > 0 && (d === Wa || f < d)) {
                        d = f;
                        c = g;
                    }
                }
            if (e === Wa || d < e) a.smallestInterval = d;
            this.closestPoints = c;
        },
        getSegments: function() {
            var a = -1, b = [], c = this.data;
            u(c, function(d, e) {
                if (d.y === null) {
                    e > a + 1 && b.push(c.slice(a + 1, e));
                    a = e;
                } else e === c.length - 1 && b.push(c.slice(a + 1, e + 1));
            });
            this.segments = b;
        },
        setOptions: function(a) {
            var b = this.chart.options.plotOptions;
            return Ca(b[this.type], b.series, a);
        },
        getColor: function() {
            var a =
                    this.chart.options.colors, b = this.chart.counters;
            this.color = this.options.color || a[b.color++] || "#0000ff";
            b.wrapColor(a.length);
        },
        getSymbol: function() {
            var a = this.chart.options.symbols, b = this.chart.counters;
            this.symbol = this.options.marker.symbol || a[b.symbol++];
            b.wrapSymbol(a.length);
        },
        addPoint: function(a, b, c, d) {
            var e = this.data, f = this.graph, g = this.area, h = this.chart;
            a = (new this.pointClass).init(this, a);
            oc(d, h);
            if (f && c) f.shift = c;
            if (g) {
                g.shift = c;
                g.isArea = true;
            }
            b = A(b, true);
            e.push(a);
            c && e[0].remove(false);
            this.getAttribs();
            this.isDirty = true;
            b && h.redraw();
        },
        setData: function(a, b) {
            var c = this, d = c.data, e = c.initialColor, f = c.chart, g = d && d.length || 0;
            c.xIncrement = null;
            if (K(e)) f.counters.color = e;
            for (a = tc(zc(a || []), function(h) { return (new c.pointClass).init(c, h); }); g--;) d[g].destroy();
            c.data = a;
            c.cleanData();
            c.getSegments();
            c.getAttribs();
            c.isDirty = true;
            f.isDirtyBox = true;
            A(b, true) && f.redraw(false);
        },
        remove: function(a, b) {
            var c = this, d = c.chart;
            a = A(a, true);
            if (!c.isRemoving) {
                c.isRemoving = true;
                Pa(c, "remove", null, function() {
                    c.destroy();
                    d.isDirtyLegend =
                        d.isDirtyBox = true;
                    a && d.redraw(b);
                });
            }
            c.isRemoving = false;
        },
        translate: function() {
            for (var a = this.chart, b = this.options.stacking, c = this.xAxis.categories, d = this.yAxis, e = this.data, f = e.length; f--;) {
                var g = e[f], h = g.x, i = g.y, j = g.low, m = d.stacks[(i < 0 ? "-" : "") + this.stackKey];
                g.plotX = this.xAxis.translate(h);
                if (b && this.visible && m && m[h]) {
                    j = m[h];
                    h = j.total;
                    j.cum = j = j.cum - i;
                    i = j + i;
                    if (b === "percent") {
                        j = h ? j * 100 / h : 0;
                        i = h ? i * 100 / h : 0;
                    }
                    g.percentage = h ? g.y * 100 / h : 0;
                    g.stackTotal = h;
                }
                if (K(j)) g.yBottom = d.translate(j, 0, 1, 0, 1);
                if (i !== null)
                    g.plotY =
                        d.translate(i, 0, 1, 0, 1);
                g.clientX = a.inverted ? a.plotHeight - g.plotX : g.plotX;
                g.category = c && c[g.x] !== Wa ? c[g.x] : g.x;
            }
        },
        setTooltipPoints: function(a) {
            var b = this.chart, c = b.inverted, d = [], e = W((c ? b.plotTop : b.plotLeft) + b.plotSizeX), f, g, h = [];
            if (a) this.tooltipPoints = null;
            u(this.segments, function(i) { d = d.concat(i); });
            if (this.xAxis && this.xAxis.reversed) d = d.reverse();
            u(d, function(i, j) {
                f = d[j - 1] ? d[j - 1]._high + 1 : 0;
                for (g = i._high = d[j + 1] ? lb((i.plotX + (d[j + 1] ? d[j + 1].plotX : e)) / 2) : e; f <= g;) h[c ? e - f++ : f++] = i;
            });
            this.tooltipPoints = h;
        },
        onMouseOver: function() {
            var a = this.chart, b = a.hoverSeries;
            if (!(!Kb && a.mouseIsDown)) {
                b && b !== this && b.onMouseOut();
                this.options.events.mouseOver && Pa(this, "mouseOver");
                this.tracker && this.tracker.toFront();
                this.setState(Bb);
                a.hoverSeries = this;
            }
        },
        onMouseOut: function() {
            var a = this.options, b = this.chart, c = b.tooltip, d = b.hoverPoint;
            d && d.onMouseOut();
            this && a.events.mouseOut && Pa(this, "mouseOut");
            c && !a.stickyTracking && c.hide();
            this.setState();
            b.hoverSeries = null;
        },
        animate: function(a) {
            var b = this.chart, c = this.clipRect,
                d = this.options.animation;
            if (d && !Nb(d)) d = { };
            if (a) {
                if (!c.isAnimating) {
                    c.attr("width", 0);
                    c.isAnimating = true;
                }
            } else {
                c.animate({ width: b.plotSizeX }, d);
                this.animate = null;
            }
        },
        drawPoints: function() {
            var a, b = this.data, c = this.chart, d, e, f, g, h, i;
            if (this.options.marker.enabled)
                for (f = b.length; f--;) {
                    g = b[f];
                    d = g.plotX;
                    e = g.plotY;
                    i = g.graphic;
                    if (e !== Wa && !isNaN(e)) {
                        a = g.pointAttr[g.selected ? "select" : ib];
                        h = a.r;
                        if (i) i.animate({ x: d, y: e, r: h });
                        else g.graphic = c.renderer.symbol(A(g.marker && g.marker.symbol, this.symbol), d, e, h).attr(a).add(this.group);
                    }
                }
        },
        convertAttribs: function(a, b, c, d) {
            var e = this.pointAttrToOptions, f, g, h = { };
            a = a || { };
            b = b || { };
            c = c || { };
            d = d || { };
            for (f in e) {
                g = e[f];
                h[f] = A(a[g], b[f], c[f], d[f]);
            }
            return h;
        },
        getAttribs: function() {
            var a = this, b = xb[a.type].marker ? a.options.marker : a.options, c = b.states, d = c[Bb], e, f = a.color, g = { stroke: f, fill: f }, h = a.data, i = [], j, m = a.pointAttrToOptions, v;
            if (a.options.marker) {
                d.radius = d.radius || b.radius + 2;
                d.lineWidth = d.lineWidth || b.lineWidth + 1;
            } else d.color = d.color || bc(d.color || f).brighten(d.brightness).get();
            i[ib] = a.convertAttribs(b,
                g);
            u([Bb, "select"], function(P) { i[P] = a.convertAttribs(c[P], i[ib]); });
            a.pointAttr = i;
            for (f = h.length; f--;) {
                g = h[f];
                if ((b = g.options && g.options.marker || g.options) && b.enabled === false) b.radius = 0;
                e = false;
                if (g.options) for (v in m) if (K(b[m[v]])) e = true;
                if (e) {
                    j = [];
                    c = b.states || { };
                    e = c[Bb] = c[Bb] || { };
                    if (!a.options.marker) e.color = bc(e.color || g.options.color).brighten(e.brightness || d.brightness).get();
                    j[ib] = a.convertAttribs(b, i[ib]);
                    j[Bb] = a.convertAttribs(c[Bb], i[Bb], j[ib]);
                    j.select = a.convertAttribs(c.select, i.select,
                        j[ib]);
                } else j = i;
                g.pointAttr = j;
            }
        },
        destroy: function() {
            var a = this, b = a.chart, c = a.clipRect, d = /\/5[0-9\.]+ (Safari|Mobile)\// .test(yc), e, f;
            Pa(a, "destroy");
            pb(a);
            a.legendItem && a.chart.legend.destroyItem(a);
            u(a.data, function(g) { g.destroy(); });
            if (c && c !== b.clipRect) a.clipRect = c.destroy();
            u(["area", "graph", "dataLabelsGroup", "group", "tracker"], function(g) {
                if (a[g]) {
                    e = d && g === "group" ? "hide" : "destroy";
                    a[g][e]();
                }
            });
            if (b.hoverSeries === a) b.hoverSeries = null;
            nc(b.series, a);
            for (f in a) delete a[f];
        },
        drawDataLabels: function() {
            if (this.options.dataLabels.enabled) {
                var a,
                    b, c = this.data, d = this.options, e = d.dataLabels, f, g = this.dataLabelsGroup, h = this.chart, i = h.renderer, j = h.inverted, m = this.type, v;
                v = d.stacking;
                var P = m === "column" || m === "bar", T = e.verticalAlign === null, Y = e.y === null;
                if (P)
                    if (v) {
                        if (T) e = Ca(e, { verticalAlign: "middle" });
                        if (Y) e = Ca(e, { y: { top: 14, middle: 4, bottom: -6 }[e.verticalAlign] });
                    } else if (T) e = Ca(e, { verticalAlign: "top" });
                if (g) g.translate(h.plotLeft, h.plotTop);
                else
                    g = this.dataLabelsGroup = i.g("data-labels").attr({ visibility: this.visible ? Ab : ob, zIndex: 6 }).translate(h.plotLeft,
                        h.plotTop).add();
                v = e.color;
                if (v === "auto") v = null;
                e.style.color = A(v, this.color, "black");
                u(c, function(H) {
                    var U = H.barX, z = U && U + H.barW / 2 || H.plotX || -999, M = A(H.plotY, -999), y = H.dataLabel, C = e.align, Z = Y ? H.y >= 0 ? -6 : 12 : e.y;
                    f = e.formatter.call(H.getLabelConfig());
                    a = (j ? h.plotWidth - M : z) + e.x;
                    b = (j ? h.plotHeight - z : M) + Z;
                    if (m === "column") a += { left: -1, right: 1 }[C] * H.barW / 2 || 0;
                    if (j && H.y < 0) {
                        C = "right";
                        a -= 10;
                    }
                    if (y) {
                        if (j && !e.y) b = b + ja(y.styles.lineHeight) * 0.9 - y.getBBox().height / 2;
                        y.attr({ text: f }).animate({ x: a, y: b });
                    } else if (K(f)) {
                        y =
                            H.dataLabel = i.text(f, a, b).attr({ align: C, rotation: e.rotation, zIndex: 1 }).css(e.style).add(g);
                        j && !e.y && y.attr({ y: b + ja(y.styles.lineHeight) * 0.9 - y.getBBox().height / 2 });
                    }
                    if (P && d.stacking && y) {
                        z = H.barY;
                        M = H.barW;
                        H = H.barH;
                        y.align(e, null, { x: j ? h.plotWidth - z - H : U, y: j ? h.plotHeight - U - M : z, width: j ? H : M, height: j ? M : H });
                    }
                });
            }
        },
        drawGraph: function() {
            var a = this, b = a.options, c = a.graph, d = [], e, f = a.area, g = a.group, h = b.lineColor || a.color, i = b.lineWidth, j = b.dashStyle, m, v = a.chart.renderer, P = a.yAxis.getThreshold(b.threshold || 0), T = /^area/ .test(a.type),
                Y = [], H = [];
            u(a.segments, function(U) {
                m = [];
                u(U, function(C, Z) {
                    if (a.getPointSpline) m.push.apply(m, a.getPointSpline(U, C, Z));
                    else {
                        m.push(Z ? Ka : Za);
                        Z && b.step && m.push(C.plotX, U[Z - 1].plotY);
                        m.push(C.plotX, C.plotY);
                    }
                });
                if (U.length > 1) d = d.concat(m);
                else Y.push(U[0]);
                if (T) {
                    var z = [], M, y = m.length;
                    for (M = 0; M < y; M++) z.push(m[M]);
                    y === 3 && z.push(Ka, m[1], m[2]);
                    if (b.stacking && a.type !== "areaspline") for (M = U.length - 1; M >= 0; M--) z.push(U[M].plotX, U[M].yBottom);
                    else z.push(Ka, U[U.length - 1].plotX, P, Ka, U[0].plotX, P);
                    H = H.concat(z);
                }
            });
            a.graphPath = d;
            a.singlePoints = Y;
            if (T) {
                e = A(b.fillColor, bc(a.color).setOpacity(b.fillOpacity || 0.75).get());
                if (f) f.animate({ d: H });
                else a.area = a.chart.renderer.path(H).attr({ fill: e }).add(g);
            }
            if (c) {
                Hc(c);
                c.animate({ d: d });
            } else if (i) {
                c = { stroke: h, "stroke-width": i };
                if (j) c.dashstyle = j;
                a.graph = v.path(d).attr(c).add(g).shadow(b.shadow);
            }
        },
        render: function() {
            var a = this, b = a.chart, c, d, e = a.options, f = e.animation, g = f && a.animate;
            f = g ? f && f.duration || 500 : 0;
            var h = a.clipRect, i = b.renderer;
            if (!h) {
                h = a.clipRect = !b.hasRendered &&
                    b.clipRect ? b.clipRect : i.clipRect(0, 0, b.plotSizeX, b.plotSizeY);
                if (!b.clipRect) b.clipRect = h;
            }
            if (!a.group) {
                c = a.group = i.g("series");
                if (b.inverted) {
                    d = function() { c.attr({ width: b.plotWidth, height: b.plotHeight }).invert(); };
                    d();
                    Qa(b, "resize", d);
                    Qa(a, "destroy", function() { pb(b, "resize", d); });
                }
                c.clip(a.clipRect).attr({ visibility: a.visible ? Ab : ob, zIndex: e.zIndex }).translate(b.plotLeft, b.plotTop).add(b.seriesGroup);
            }
            a.drawDataLabels();
            g && a.animate(true);
            a.drawGraph && a.drawGraph();
            a.drawPoints();
            a.options.enableMouseTracking !==
                false && a.drawTracker();
            g && a.animate();
            setTimeout(function() {
                h.isAnimating = false;
                if ((c = a.group) && h !== b.clipRect && h.renderer) {
                    c.clip(a.clipRect = b.clipRect);
                    h.destroy();
                }
            }, f);
            a.isDirty = false;
        },
        redraw: function() {
            var a = this.chart, b = this.group;
            if (b) {
                a.inverted && b.attr({ width: a.plotWidth, height: a.plotHeight });
                b.animate({ translateX: a.plotLeft, translateY: a.plotTop });
            }
            this.translate();
            this.setTooltipPoints(true);
            this.render();
        },
        setState: function(a) {
            var b = this.options, c = this.graph, d = b.states;
            b = b.lineWidth;
            a = a ||
                ib;
            if (this.state !== a) {
                this.state = a;
                if (!(d[a] && d[a].enabled === false)) {
                    if (a) b = d[a].lineWidth || b + 1;
                    if (c && !c.dashstyle) c.attr({ "stroke-width": b }, a ? 0 : 500);
                }
            }
        },
        setVisible: function(a, b) {
            var c = this.chart, d = this.legendItem, e = this.group, f = this.tracker, g = this.dataLabelsGroup, h, i = this.data, j = c.options.chart.ignoreHiddenSeries;
            h = this.visible;
            h = (this.visible = a = a === Wa ? !h : a) ? "show" : "hide";
            e && e[h]();
            if (f) f[h]();
            else
                for (e = i.length; e--;) {
                    f = i[e];
                    f.tracker && f.tracker[h]();
                }
            g && g[h]();
            d && c.legend.colorizeItem(this, a);
            this.isDirty =
                true;
            this.options.stacking && u(c.series, function(m) { if (m.options.stacking && m.visible) m.isDirty = true; });
            if (j) c.isDirtyBox = true;
            b !== false && c.redraw();
            Pa(this, h);
        },
        show: function() { this.setVisible(true); },
        hide: function() { this.setVisible(false); },
        select: function(a) {
            this.selected = a = a === Wa ? !this.selected : a;
            if (this.checkbox) this.checkbox.checked = a;
            Pa(this, a ? "select" : "unselect");
        },
        drawTracker: function() {
            var a = this, b = a.options, c = [].concat(a.graphPath), d = c.length, e = a.chart, f = e.options.tooltip.snap, g = a.tracker, h = b.cursor;
            h = h && { cursor: h };
            var i = a.singlePoints, j;
            if (d)
                for (j = d + 1; j--;) {
                    c[j] === Za && c.splice(j + 1, 0, c[j + 1] - f, c[j + 2], Ka);
                    if (j && c[j] === Za || j === d) c.splice(j, 0, Ka, c[j - 2] + f, c[j - 1]);
                }
            for (j = 0; j < i.length; j++) {
                d = i[j];
                c.push(Za, d.plotX - f, d.plotY, Ka, d.plotX + f, d.plotY);
            }
            if (g) g.attr({ d: c });
            else
                a.tracker = e.renderer.path(c).attr({ isTracker: true, stroke: ce, fill: jb, "stroke-width": b.lineWidth + 2 * f, visibility: a.visible ? Ab : ob, zIndex: b.zIndex || 1 }).on(Kb ? "touchstart" : "mouseover", function() { e.hoverSeries !== a && a.onMouseOver(); }).on("mouseout",
                    function() { b.stickyTracking || a.onMouseOut(); }).css(h).add(e.trackerGroup);
        }
    };
    ma = yb(sb);
    wb.line = ma;
    ma = yb(sb, { type: "area" });
    wb.area = ma;
    ma = yb(sb, {
        type: "spline",
        getPointSpline: function(a, b, c) {
            var d = b.plotX, e = b.plotY, f = a[c - 1], g = a[c + 1], h, i, j, m;
            if (c && c < a.length - 1) {
                a = f.plotY;
                j = g.plotX;
                g = g.plotY;
                var v;
                h = (1.5 * d + f.plotX) / 2.5;
                i = (1.5 * e + a) / 2.5;
                j = (1.5 * d + j) / 2.5;
                m = (1.5 * e + g) / 2.5;
                v = (m - i) * (j - d) / (j - h) + e - m;
                i += v;
                m += v;
                if (i > a && i > e) {
                    i = Ia(a, e);
                    m = 2 * e - i;
                } else if (i < a && i < e) {
                    i = tb(a, e);
                    m = 2 * e - i;
                }
                if (m > g && m > e) {
                    m = Ia(g, e);
                    i = 2 * e - m;
                } else if (m <
                    g && m < e) {
                    m = tb(g, e);
                    i = 2 * e - m;
                }
                b.rightContX = j;
                b.rightContY = m;
            }
            if (c) {
                b = ["C", f.rightContX || f.plotX, f.rightContY || f.plotY, h || d, i || e, d, e];
                f.rightContX = f.rightContY = null;
            } else b = [Za, d, e];
            return b;
        }
    });
    wb.spline = ma;
    ma = yb(ma, { type: "areaspline" });
    wb.areaspline = ma;
    var hd = yb(sb, {
        type: "column",
        pointAttrToOptions: { stroke: "borderColor", "stroke-width": "borderWidth", fill: "color", r: "borderRadius" },
        init: function() {
            sb.prototype.init.apply(this, arguments);
            var a = this, b = a.chart;
            b.hasColumn = true;
            b.hasRendered && u(b.series, function(c) {
                if (c.type ===
                    a.type) c.isDirty = true;
            });
        },
        translate: function() {
            var a = this, b = a.chart, c = a.options, d = c.stacking, e = c.borderWidth, f = 0, g = a.xAxis.reversed, h = a.xAxis.categories, i = { }, j, m;
            sb.prototype.translate.apply(a);
            u(b.series, function(C) {
                if (C.type === a.type && C.visible) {
                    if (C.options.stacking) {
                        j = C.stackKey;
                        if (i[j] === Wa) i[j] = f++;
                        m = i[j];
                    } else m = f++;
                    C.columnIndex = m;
                }
            });
            var v = a.data, P = a.closestPoints;
            h = bb(v[1] ? v[P].plotX - v[P - 1].plotX : b.plotSizeX / (h && h.length || 1));
            P = h * c.groupPadding;
            var T = (h - 2 * P) / f, Y = c.pointWidth, H = K(Y) ? (T - Y) / 2 :
                T * c.pointPadding, U = Ia(A(Y, T - 2 * H), 1), z = H + (P + ((g ? f - a.columnIndex : a.columnIndex) || 0) * T - h / 2) * (g ? -1 : 1), M = a.yAxis.getThreshold(c.threshold || 0), y = A(c.minPointLength, 5);
            u(v, function(C) {
                var Z = C.plotY, Sa = C.yBottom || M, Na = C.plotX + z, Ea = md(tb(Z, Sa)), gb = md(Ia(Z, Sa) - Ea), Lb = a.yAxis.stacks[(C.y < 0 ? "-" : "") + a.stackKey], Rb;
                d && a.visible && Lb && Lb[C.x] && Lb[C.x].setOffset(z, U);
                if (bb(gb) < y) {
                    if (y) {
                        gb = y;
                        Ea = bb(Ea - M) > y ? Sa - y : M - (Z <= M ? y : 0);
                    }
                    Rb = Ea - 3;
                }
                sa(C, { barX: Na, barY: Ea, barW: U, barH: gb });
                C.shapeType = "rect";
                Z = sa(b.renderer.Element.prototype.crisp.apply({ },
                    [e, Na, Ea, U, gb]), { r: c.borderRadius });
                if (e % 2) {
                    Z.y -= 1;
                    Z.height += 1;
                }
                C.shapeArgs = Z;
                C.trackerArgs = K(Rb) && Ca(C.shapeArgs, { height: Ia(6, gb + 3), y: Rb });
            });
        },
        getSymbol: function() {
        },
        drawGraph: function() {
        },
        drawPoints: function() {
            var a = this, b = a.options, c = a.chart.renderer, d, e;
            u(a.data, function(f) {
                var g = f.plotY;
                if (g !== Wa && !isNaN(g) && f.y !== null) {
                    d = f.graphic;
                    e = f.shapeArgs;
                    if (d) {
                        Hc(d);
                        d.animate(e);
                    } else f.graphic = c[f.shapeType](e).attr(f.pointAttr[f.selected ? "select" : ib]).add(a.group).shadow(b.shadow);
                }
            });
        },
        drawTracker: function() {
            var a =
                    this, b = a.chart, c = b.renderer, d, e, f = +new Date, g = a.options, h = g.cursor, i = h && { cursor: h }, j;
            u(a.data, function(m) {
                e = m.tracker;
                d = m.trackerArgs || m.shapeArgs;
                delete d.strokeWidth;
                if (m.y !== null)
                    if (e) e.attr(d);
                    else
                        m.tracker = c[m.shapeType](d).attr({ isTracker: f, fill: ce, visibility: a.visible ? Ab : ob, zIndex: g.zIndex || 1 }).on(Kb ? "touchstart" : "mouseover", function(v) {
                            j = v.relatedTarget || v.fromElement;
                            b.hoverSeries !== a && Ga(j, "isTracker") !== f && a.onMouseOver();
                            m.onMouseOver();
                        }).on("mouseout", function(v) {
                            if (!g.stickyTracking) {
                                j =
                                    v.relatedTarget || v.toElement;
                                Ga(j, "isTracker") !== f && a.onMouseOut();
                            }
                        }).css(i).add(m.group || b.trackerGroup);
            });
        },
        animate: function(a) {
            var b = this, c = b.data;
            if (!a) {
                u(c, function(d) {
                    var e = d.graphic;
                    d = d.shapeArgs;
                    if (e) {
                        e.attr({ height: 0, y: b.yAxis.translate(0, 0, 1) });
                        e.animate({ height: d.height, y: d.y }, b.options.animation);
                    }
                });
                b.animate = null;
            }
        },
        remove: function() {
            var a = this, b = a.chart;
            b.hasRendered && u(b.series, function(c) { if (c.type === a.type) c.isDirty = true; });
            sb.prototype.remove.apply(a, arguments);
        }
    });
    wb.column = hd;
    ma = yb(hd,
        {
            type: "bar",
            init: function(a) {
                a.inverted = this.inverted = true;
                hd.prototype.init.apply(this, arguments);
            }
        });
    wb.bar = ma;
    ma = yb(sb, {
        type: "scatter",
        translate: function() {
            var a = this;
            sb.prototype.translate.apply(a);
            u(a.data, function(b) {
                b.shapeType = "circle";
                b.shapeArgs = { x: b.plotX, y: b.plotY, r: a.chart.options.tooltip.snap };
            });
        },
        drawTracker: function() {
            var a = this, b = a.options.cursor, c = b && { cursor: b }, d;
            u(a.data, function(e) {
                (d = e.graphic) && d.attr({ isTracker: true }).on("mouseover", function() {
                    a.onMouseOver();
                    e.onMouseOver();
                }).on("mouseout",
                    function() { a.options.stickyTracking || a.onMouseOut(); }).css(c);
            });
        },
        cleanData: function() {
        }
    });
    wb.scatter = ma;
    ma = yb(Oc, {
        init: function() {
            Oc.prototype.init.apply(this, arguments);
            var a = this, b;
            sa(a, { visible: a.visible !== false, name: A(a.name, "Slice") });
            b = function() { a.slice(); };
            Qa(a, "select", b);
            Qa(a, "unselect", b);
            return a;
        },
        setVisible: function(a) {
            var b = this.series.chart, c = this.tracker, d = this.dataLabel, e = this.connector, f = this.shadowGroup, g;
            g = (this.visible = a = a === Wa ? !this.visible : a) ? "show" : "hide";
            this.group[g]();
            c &&
                c[g]();
            d && d[g]();
            e && e[g]();
            f && f[g]();
            this.legendItem && b.legend.colorizeItem(this, a);
        },
        slice: function(a, b, c) {
            var d = this.series.chart, e = this.slicedTranslation;
            oc(c, d);
            A(b, true);
            a = this.sliced = K(a) ? a : !this.sliced;
            a = { translateX: a ? e[0] : d.plotLeft, translateY: a ? e[1] : d.plotTop };
            this.group.animate(a);
            this.shadowGroup && this.shadowGroup.animate(a);
        }
    });
    ma = yb(sb, {
        type: "pie",
        isCartesian: false,
        pointClass: ma,
        pointAttrToOptions: { stroke: "borderColor", "stroke-width": "borderWidth", fill: "color" },
        getColor: function() {
            this.initialColor =
                this.chart.counters.color;
        },
        animate: function() {
            var a = this;
            u(a.data, function(b) {
                var c = b.graphic;
                b = b.shapeArgs;
                var d = -kc / 2;
                if (c) {
                    c.attr({ r: 0, start: d, end: d });
                    c.animate({ r: b.r, start: b.start, end: b.end }, a.options.animation);
                }
            });
            a.animate = null;
        },
        translate: function() {
            var a = 0, b = -0.25, c = this.options, d = c.slicedOffset, e = d + c.borderWidth, f = c.center.concat([c.size, c.innerSize || 0]), g = this.chart, h = g.plotWidth, i = g.plotHeight, j, m, v, P = this.data, T = 2 * kc, Y, H = tb(h, i), U, z, M, y = c.dataLabels.distance;
            f = tc(f, function(C, Z) {
                return (U =
                    /%$/ .test(C)) ? [h, i, H, H][Z] * ja(C) / 100 : C;
            });
            this.getX = function(C, Z) {
                v = Fa.asin((C - f[1]) / (f[2] / 2 + y));
                return f[0] + (Z ? -1 : 1) * rb(v) * (f[2] / 2 + y);
            };
            this.center = f;
            u(P, function(C) { a += C.y; });
            u(P, function(C) {
                Y = a ? C.y / a : 0;
                j = W(b * T * 1E3) / 1E3;
                b += Y;
                m = W(b * T * 1E3) / 1E3;
                C.shapeType = "arc";
                C.shapeArgs = { x: f[0], y: f[1], r: f[2] / 2, innerR: f[3] / 2, start: j, end: m };
                v = (m + j) / 2;
                C.slicedTranslation = tc([rb(v) * d + g.plotLeft, Cb(v) * d + g.plotTop], W);
                z = rb(v) * f[2] / 2;
                M = Cb(v) * f[2] / 2;
                C.tooltipPos = [f[0] + z * 0.7, f[1] + M * 0.7];
                C.labelPos = [f[0] + z + rb(v) * y, f[1] + M + Cb(v) *
                    y, f[0] + z + rb(v) * e, f[1] + M + Cb(v) * e, f[0] + z, f[1] + M, y < 0 ? "center" : v < T / 4 ? "left" : "right", v];
                C.percentage = Y * 100;
                C.total = a;
            });
            this.setTooltipPoints();
        },
        render: function() {
            this.drawPoints();
            this.options.enableMouseTracking !== false && this.drawTracker();
            this.drawDataLabels();
            this.options.animation && this.animate && this.animate();
            this.isDirty = false;
        },
        drawPoints: function() {
            var a = this.chart, b = a.renderer, c, d, e, f = this.options.shadow, g, h;
            u(this.data, function(i) {
                d = i.graphic;
                h = i.shapeArgs;
                e = i.group;
                g = i.shadowGroup;
                if (f && !g)
                    g =
                        i.shadowGroup = b.g("shadow").attr({ zIndex: 4 }).add();
                if (!e) e = i.group = b.g("point").attr({ zIndex: 5 }).add();
                c = i.sliced ? i.slicedTranslation : [a.plotLeft, a.plotTop];
                e.translate(c[0], c[1]);
                g && g.translate(c[0], c[1]);
                if (d) d.animate(h);
                else i.graphic = b.arc(h).attr(sa(i.pointAttr[ib], { "stroke-linejoin": "round" })).add(i.group).shadow(f, g);
                i.visible === false && i.setVisible(false);
            });
        },
        drawDataLabels: function() {
            var a = this.data, b, c = this.chart, d = this.options.dataLabels, e = A(d.connectorPadding, 10), f = A(d.connectorWidth, 1),
                g, h, i = A(d.softConnector, true), j = d.distance, m = this.center, v = m[2] / 2;
            m = m[1];
            var P = j > 0, T = [[], []], Y, H, U, z, M = 2, y;
            if (d.enabled) {
                sb.prototype.drawDataLabels.apply(this);
                u(a, function(gb) { if (gb.dataLabel) T[gb.labelPos[7] < kc / 2 ? 0 : 1].push(gb); });
                T[1].reverse();
                z = function(gb, Lb) { return Lb.y - gb.y; };
                for (a = T[0][0] && T[0][0].dataLabel && ja(T[0][0].dataLabel.styles.lineHeight); M--;) {
                    var C = [], Z = [], Sa = T[M], Na = Sa.length, Ea;
                    for (y = m - v - j; y <= m + v + j; y += a) C.push(y);
                    U = C.length;
                    if (Na > U) {
                        h = [].concat(Sa);
                        h.sort(z);
                        for (y = Na; y--;)
                            h[y].rank =
                                y;
                        for (y = Na; y--;) Sa[y].rank >= U && Sa.splice(y, 1);
                        Na = Sa.length;
                    }
                    for (y = 0; y < Na; y++) {
                        b = Sa[y];
                        h = b.labelPos;
                        b = 9999;
                        for (H = 0; H < U; H++) {
                            g = bb(C[H] - h[1]);
                            if (g < b) {
                                b = g;
                                Ea = H;
                            }
                        }
                        if (Ea < y && C[y] !== null) Ea = y;
                        else {
                            if (U < Na - y + Ea && C[y] !== null) Ea = U - Na + y;
                            for (; C[Ea] === null;) Ea++;
                        }
                        Z.push({ i: Ea, y: C[Ea] });
                        C[Ea] = null;
                    }
                    Z.sort(z);
                    for (y = 0; y < Na; y++) {
                        b = Sa[y];
                        h = b.labelPos;
                        g = b.dataLabel;
                        H = Z.pop();
                        Y = h[1];
                        U = b.visible === false ? ob : Ab;
                        Ea = H.i;
                        H = H.y;
                        if (Y > H && C[Ea + 1] !== null || Y < H && C[Ea - 1] !== null) H = Y;
                        Y = this.getX(Ea === 0 || Ea === C.length - 1 ? Y : H, M);
                        g.attr({
                            visibility: U,
                            align: h[6]
                        })[g.moved ? "animate" : "attr"]({ x: Y + d.x + ({ left: e, right: -e }[h[6]] || 0), y: H + d.y });
                        g.moved = true;
                        if (P && f) {
                            g = b.connector;
                            h = i ? [Za, Y + (h[6] === "left" ? 5 : -5), H, "C", Y, H, 2 * h[2] - h[4], 2 * h[3] - h[5], h[2], h[3], Ka, h[4], h[5]] : [Za, Y + (h[6] === "left" ? 5 : -5), H, Ka, h[2], h[3], Ka, h[4], h[5]];
                            if (g) {
                                g.animate({ d: h });
                                g.attr("visibility", U);
                            } else b.connector = g = this.chart.renderer.path(h).attr({ "stroke-width": f, stroke: d.connectorColor || b.color || "#606060", visibility: U, zIndex: 3 }).translate(c.plotLeft, c.plotTop).add();
                        }
                    }
                }
            }
        },
        drawTracker: hd.prototype.drawTracker,
        getSymbol: function() {
        }
    });
    wb.pie = ma;
    db.Highcharts = {
        Chart: Nd,
        dateFormat: Zc,
        pathAnim: Nc,
        getOptions: function() { return Xa; },
        hasRtlBug: me,
        numberFormat: Ed,
        Point: Oc,
        Color: bc,
        Renderer: fd,
        seriesTypes: wb,
        setOptions: function(a) {
            Xa = Ca(Xa, a);
            Id();
            return Xa;
        },
        Series: sb,
        addEvent: Qa,
        removeEvent: pb,
        createElement: hb,
        discardElement: pc,
        css: Ja,
        each: u,
        extend: sa,
        map: tc,
        merge: Ca,
        pick: A,
        extendClass: yb,
        product: "Highcharts",
        version: "2.1.9"
    };
})();